GitHubではユーザーがリポジトリにスターを付けることができ、たくさんのスターを集めたリポジトリは「人気がある」「信頼性が高い」とみなされることが多くなります。しかし、それを逆手にとって偽のスターを購入することで人気度や信頼性を偽装しているリポジトリも存在しています。リポジトリに付いているスターが正当なものなのか、それとも偽装されたものなのかについて調べる方法をデータオーケストレーションサービスを提供するスタートアップのDagsterが開発し、ブログに掲載しました。

Tracking the Fake GitHub Star Black Market with Dagster, dbt and BigQuery | Dagster Blog

https://dagster.io/blog/fake-stars

GitHubにおける「スター」は、機能的にはFacebookやX(旧Twitter)の「いいね」と変わりませんが、リポジトリのスター数が多いと使用するライブラリの選定理由になったり、オープンソーススタートアップが資金調達する時に有利に働いたりするなどの特徴があります。

Dagsterチームがいくつかのプロジェクトを観察していたところ、リポジトリの作成直後や新しいリリース・大きな発表の直前などのタイミングで突然スター数が数百個も増加しているのを発見したとのこと。こうした怪しげなスターを付けたアカウントを確認すると、下図の通り同一の日付で作成されていました。



偽のスターを検出する方法を研究するため、Dagsterチームはダミーリポジトリを作成し、実際に下記の2つのサービスからスターを購入してみたとのこと。

・Baddhi Shop

GitHubのスターだけでなく、オンラインのさまざまな指標を購入できるサービスです。GitHubのスターは1000個あたり64ドル(約9600円)で、Dagsterチームは500個のスターを購入したところ、1週間かけてスターの付与が行われました。なお、1カ月後には75%のスターが消え去っていたとのこと。

・GitHub24

スター1個あたり0.85ユーロ(約136円)という高級なサービスです。Dagsterチームが100個のスターを注文すると48時間で付与が完了し、1カ月後も全てのスターが残ったままでした。

下図のスター数の履歴グラフを見ると購入時にスター数が跳ね上がっていることが分かります。



GitHubで偽のスターを付けるためのアカウントは「スパムアカウントであることを隠そうとせず、見ただけですぐに判断できる偽アカウント」と「本物に見えるアクティビティを備えた精巧な偽アカウント」の2種類に分けることができます。Dagsterチームはどちらにも対応するため、スパムの検出器を2つ用意することにしました。

◆明らかな偽アカウントを特定する

DagsterチームがGitHub APIを使用して分析したところ、明らかな偽アカウントには下記のような明確なパターンが存在することが分かりました。

・2022年以降に作成

・フォロワーが1人以下

・フォロー中が1人以下

・パブリックGistなし

・パブリックリポジトリが4個以下

・メール、雇用可否、自己紹介、ブログ、X(旧Twitter)のユーザー名が空

・スター付与日とアカウント作成日、アカウント更新日が同一

こうしたパターンを利用することで、GitHub APIから入手可能なデータのみを使用して疑わしいアカウントを特定することが可能とのこと。



◆巧妙な偽アカウントを特定する

偽のGitHubアカウントのもう1つのグループを特定するのはかなり難しかったとのこと。それぞれのアカウントには人間らしい活動の履歴に加えてプロフィール写真や経歴も用意されており、購入したアカウントだと分かっていても見分けるのは困難でした。

最終的にDagsterチームは「教師なしクラスタリング」と呼ばれる手法を利用しました。この手法では、アクティビティが発生した日などのデータを元にユーザーをグループ化します。本物の人間であればアクティビティはさまざまな日に分散する一方で、偽のユーザーは制御スクリプトなどの都合でアクティビティの発生日が同期し、大きな偽アカウントグループを形成します。

例えば下図はダミーリポジトリにスターを付けたユーザーを「他のユーザーと同じ日にアクティビティが発生した数」と「操作したリポジトリの総数」でプロットしたもの。赤い点は既知の偽アカウントを示しており、黄色い点は偽の疑いのあるアカウントを示しています。



一方、Dagsterリポジトリにスターを付けたユーザーをプロットした結果は下図の通り。左下の黄色い点は誤検知が発生していることを示しているとのこと。



本物と偽物が混じっている疑いのあるリポジトリの分析結果は下図の通り。偽アカウントのグループが形成されています。



さらに、Dagsterチームは偽アカウントのグループが特定のリポジトリとやりとりする傾向があることを発見し、分析の信頼性を改善しました。最終的に以下の手順で偽アカウントを判別したとのこと。

1:ユーザーリストを取得

分析対象のリポジトリにスターを付けた全ユーザーのリストを取得します。

2:「怪しいユーザーグループ」を判別

リストに入っているユーザーが共通してスターを付けているリポジトリを探します。多数のリポジトリに重複してスターを付けているユーザーのグループはかなり怪しいものの、分野によっては本物のアカウントでも一連の同じリポジトリにスターを付ける場合があるため、手順3を行います。

3:アクティビティのレベルでフィルタリング

最後にそれぞれのユーザーのアクティビティを分析します。アクティビティが少ないユーザーのアクティビティの大部分は手順2で登場したリポジトリでのアクティビティで、追加の正当なアクティビティが存在しなかったとのこと。こうして偽のアカウントを特定できました。

ダミーアカウントに対する既知の偽スターに対して分析を行ったところ、非常に計算コストはかかるものの精度98%・再現率85%で偽のアカウントを検出できたと述べられています。いくつかのリポジトリについて今回の2つの手法を利用して偽スター数を調べた結果は以下の通り。教師なしクラスタリングを活用することで、単純なヒューリスティックでは検出できなかった偽アカウントについても検出できるようになりました。

 単純なヒューリスティック
(明らかな偽物, 低再現率)単純なヒューリスティクス + 教師なしクラスタリング
(明らか&洗練された偽物)リポジトリ合計スター数偽スター偽スター%2022年以降の偽スター%okcash75910.13%97%Simple-GPU78715920%87%Notifio8419712%76%Mage.ai3,62953315%30%Apache Airflow29,435170.06%1.6%Ploomber3,00260.2%1.5%Dagster6,53880.12%1.5%Flyte3,15410.03%1.1%

今回分析に使用したコードはGitHubで公開されているので、興味がある人は確認してみて下さい。◆関連記事

技術選定をGitHubのスター数で行う場合の落とし穴についてオープンソース開発者のグループが語る - GIGAZINE

「10年かけてGitHubリポジトリが集めた5万4000個ものスターをうっかりミスで失ってしまった」という体験談 - GIGAZINE

GitHubで採用されなかった実績バッジ「+1だけのコメントを100件投稿する」「force pushで他人のコミットを消滅させる」「README.mdだけのプロジェクトを5年寝かせる」などを妄想するプロジェクト - GIGAZINE

GitHubの利用をやめるようオープンソースソフトウェア非営利団体が強く呼びかけ - GIGAZINE

Facebookがオープンソースのプロジェクトをうっかり乗っ取ってしまう - GIGAZINE