
GitHub의 가짜 참여 자동 탐지 및 추적 — 일일 CI, 인프라 제로
GitHub에서 가짜 참여를 자동 탐지하고 추적합니다
JS Labs 프로젝트 —
AI Slop Intelligence 이니셔티브의 일환.
매일 실행됩니다. 모든 의심 계정을 점수화합니다. 조직적인 봇 캠페인을 탐지합니다.
손상된 저장소에 직접 이슈를 등록하여 관리자가 조치를 취할 수 있게 합니다.
이 프로젝트 지원하기
BTC 3QjWqhQbHdHgWeYHTpmorP8Pe1wgDjJy54
ETH 0x5851e6145F4773d1585b8686095FB16E368a4dA1
ZEC t1KSR5YkNPbjqRSCoLKo5AddFWdm9Kzxh1B
GitHub 스타는 신뢰 신호입니다. 개발자들이 무엇을 평가하고, 무엇에 의존하며, 무엇을 추천할지 결정하는 기준입니다. 그 신호가 조직적으로 훼손되고 있습니다.
2024~2026년 AI 붐 동안 품질이 낮거나 악성인 저장소에 신뢰도를 조작하기 위한 봇 팜 업계가 등장했습니다. 48시간 만에 800개의 스타를 받은 프로젝트는 검색 결과를 훑는 개발자에게 정상적인 프로젝트로 보입니다. 그것이 바로 요점입니다. 가짜 참여의 목표는 스타 자체가 아니라, 그 스타가 만들어내는 사회적 증명과 그 사회적 증명이 영향을 미치는 후속 결정입니다.
그 패턴은 식별 가능합니다. 같은 주에 생성된 계정, 프로필 소개 없음, 팔로워 없음, 원본 저장소 없음, 2시간 창 안에서 같은 15개 저장소에 스타를 누른 경우. 단일 캠페인이 아니라 매일 수천 개의 계정에 걸쳐 수십 개의 캠페인이 동시에 실행되고 있습니다. 데이터는 참여자 185명 중 185명이 봇인 저장소를 보여줍니다. 100% 가짜 비율입니다. 트렌딩 순위 전체가 아무것도 없는 기반 위에 세워졌습니다.
phantomstars는 이 문제가 해결 가능하기 때문에 만들어졌습니다. GitHub 공개 API의 신호 대비 잡음 비율은 현재까지도 충분히 높아서 조직적인 캠페인이 뚜렷한 지문을 남깁니다. 이 프로젝트는 그 지문을 읽고, 원시 데이터를 공개하며, 영향을 받은 저장소 관리자에게 직접 알립니다.
이 프로젝트는 JS Labs의 광범위한 AI Slop Intelligence 연구의 일부로, 저품질 AI 생성 콘텐츠가 개발자 생태계를 범람하는 메커니즘과 그 측정 가능한 영향을 조사합니다. 가짜 참여는 주변부 문제가 아닙니다. 그것은 슬롭(slop)을 실제 사용자 앞에 전달하는 유통 메커니즘입니다.
phantomstars는 매일 실행되는 GitHub Actions 작업으로 다음을 수행합니다.
r/osinttools와 r/coolgithubprojects의 최근 Reddit 게시물에서 지난 2일 동안 GitHub 저장소 링크를 추출하여 추가 후보 저장소를 시드합니다서버 없음. 데이터베이스 없음. 인프라 비용 없음.
네. 저장소의 가짜 비율이 40%를 초과하거나 조직적 캠페인이 탐지되면 phantomstars는 해당 저장소에 직접 이슈를 엽니다. 이슈에는 전체 의심 계정 표, 캠페인 구성원, 종합 점수, 계정 생성 날짜가 포함됩니다. 관리자가 조사하고 GitHub에 신고하는 데 필요한 모든 정보입니다.
표적 저장소에서 이슈가 비활성화되어 있으면 알림은 조용히 건너뛰고 스캔 로그에 기록됩니다.
네.
owner/repo 형식으로 저장소를 제출하고 대상 스캔을 실행하면 됩니다.이렇게 나눈 이유:
네. 계정이 data/suspects.jsonl에 나타나고 분류가 잘못되었다고 생각되면 제공된 템플릿을 사용하여 오탐지 이슈 열기를 통해 신고하세요. 보고서는 허용 목록에 추가되기 전에 수동으로 검토됩니다. 허용 목록은 data/allowlist.txt에 저장되며, 여기에 있는 계정은 향후 모든 스캔과 의심 계정 원장에서 제외됩니다.
캠페인 ID(예: c-a3f9b2e1)는 해당 캠페인의 구성원 로그인 정렬 집합의 SHA-256 해시에서 파생된 결정적 8자리 16진수 지문입니다. 동일한 계정 그룹은 독립적인 스캔 실행에서도 동일한 캠페인 ID를 생성하므로 종단 추적이 가능합니다. 저장소 이름, 사용자 이름 또는 외부 식별자가 아닙니다.
안정성: 캠페인의 구성원 집합이 변경되지 않는 한 ID는 안정적입니다. 스캔 사이에 봇이 추가되거나 정지되면 구성원이 변경되었으므로 ID도 변경됩니다. 이는 예상된 동작이며 봇 팜 구성의 실제 변화를 반영합니다.
네. 모든 계정의 생성 날짜는 GitHub GraphQL API(createdAt 필드)에서 가져와 각 의심 계정 레코드에 account_created_at으로 저장됩니다. 또한 가짜 계정을 판별하는 가장 강력한 단일 신호인 계정 연령 점수의 주요 입력값이기도 합니다. 참여 2일 이내에 생성된 계정은 연령만으로 1.0점을 받습니다.
개별 점수는 상당한 오탐률을 지닙니다. 프로필이 빈약한 신규 개발자도 정당하게 0.75+ 점수를 받을 수 있습니다. 이 도구는 이슈를 제기하기 전에 캠페인 수준의 증거를 요구함으로써 이를 보완합니다. 의심 계정 하나만으로는 충분하지 않습니다. 같은 주에 생성되고 모두 0.75+ 점수를 받았으며 90분 안에 모두 참여한 40개 이상의 계정으로 구성된 조정된 클러스터는 다른 문제입니다. 그 지점에서 신뢰도가 실행 가능해집니다.
데이터는 항상 확률적입니다. 이슈 본문에도 그렇게 명시되어 있습니다. 목표는 관리자에게 신호와 원시 증거를 제공하여 스스로 판단하게 하는 것입니다.
| 날짜 | 검사 대상 | 가능성 높은 가짜 | 의심 계정 | 캠페인 | 신규 가짜 (24시간) |
|---|---|---|---|---|---|
| 2026-06-16 | 1846 | 221 | 1625 | 56 | 190 |
| 2026-06-15 | 2274 | 418 | 1856 | 61 | 397 |
| 2026-06-14 | 1953 | 355 | 1598 | 44 | 310 |
| 2026-06-13 | 2012 | 301 | 1711 | 47 | 251 |
| 2026-06-12 | 2298 | 336 | 1962 | 57 | 300 |
| 2026-06-11 | 1957 | 385 | 1572 | 42 | 356 |
| 2026-06-10 | 2043 | 687 | 1356 | 50 | 665 |
| 2026-06-09 | 2199 | 690 | 1509 | 44 | 632 |
| 2026-06-08 | 1913 | 450 | 1463 | 50 | 424 |
| 2026-06-07 | 1797 | 658 | 1139 | 30 | 618 |
| 2026-06-06 | 2625 | 712 | 1913 | 40 | 620 |
| 2026-06-05 | 2403 | 673 | 1730 | 53 | 617 |
| 2026-06-04 | 2237 | 441 | 1796 | 41 | 367 |
| 2026-06-03 | 2331 | 488 | 1843 | 53 | 431 |
| 2026-06-02 | 2795 | 773 | 2022 | 37 | 616 |
| 2026-06-01 | 2490 | 533 | 1957 | 39 | 355 |
| 2026-05-31 | 2302 | 458 | 1844 | 32 | 280 |
| 2026-05-30 | 2576 | 530 | 2046 | 20 | 356 |
| 2026-05-29 | 2838 | 733 | 2105 | 42 | 369 |
| 2026-05-28 | 2748 | 694 | 2054 | 39 | 396 |
| 2026-05-27 | 2193 | 560 | 1633 | 32 | 491 |
| 2026-05-26 | 1930 | 236 | 1694 | 43 | 190 |
| 2026-05-25 | 1526 | 214 | 1312 | 32 | 158 |
| 2026-05-24 | 2170 | 358 | 1812 | 39 | 265 |
| 2026-05-23 | 2548 | 426 | 2122 | 43 | 317 |
| 2026-05-22 | 2318 | 340 | 1978 | 47 | 247 |
| 2026-05-21 | 1981 | 348 | 1633 | 25 | 277 |
| 2026-05-20 | 1613 | 268 | 1345 | 23 | 163 |
| 2026-05-19 | 5463 | 630 | 4121 | 67 | 442 |
| 2026-05-18 | 8838 | 670 | 7950 | 128 | 340 |