Files
keyhunter-parser/RESEARCH_upgrade.md

19 KiB
Raw Permalink Blame History

Deep Research: KeyFarm parser upgrade — «ебанутый масштаб» + авто-рессерч

Generated: 2026-09-26 | Sources: ~90 (4 researcher-агента: Detectors, Sources, Validation, Scaling) | Confidence: High

Executive Summary

Рынок утечек растёт на 25-34%/год: 23.77M новых секретов в публичном GitHub за 2024 (GitGuardian), 28.65M за 2025 (Snyk), утечки AI-сервисов +81% YoY. Наш парсер покрывает ~12 форматов ключей и 8 источников; SOTA-сканеры (TruffleHog 800+ детекторов, Gitleaks 222 правила) и полевые данные (Truffle Security: 221,303 живых креда в 6,003 HF-датасетах; ~100k секретов в 15M Docker-образах) показывают 3 главные дыры: (1) нет 20+ провайдерных паттернов, (2) нет 5 источников с экстремальной плотностью (HF, Docker Hub, Wayback, t.me/s/, реестры), (3) валидатор ошибочно считает 400/403 «мёртвыми». Архитектурный потолок снимается переходом с SQLite-центрика на Postgres SKIP LOCKED + графовое расширение сидов.


1. Рынок и масштаб (зачем «масштаб»)

Факт Цифра Источник
Новых секретов в паблик GitHub, 2024 23.77M (+25%) GitGuardian SoSS 2025
То же, 2025 28.65M (+34%) Snyk
Утечки AI-сервисов +81% YoY SoSS 2026
Секреты 2022-года, всё ещё живые 70% SoSS 2025 PR
% публичных репо с секретом 4.6% (69.6M репо просканено) SoSS 2025 PDF
PyPI файлов/день ~10,600 (3.9M/год) PyPI 2025 review
Коммитов с Claude Code с утечкой 3.2% против 1.5% базовых SoSS 2026 PR

Вывод: поток входящих утечек растёт быстрее любого парсера — узкое место не CPU, а охват источников + паттерны + валидация.

2. Конкурентный ландшафт (движки)

Движок Механика Наш gap
TruffleHog v3 (~800 детекторов) regex+keywords prefilter → live verify → триномиальный статус verified/unverified/unknown (401=dead, 5xx/timeout=unknown); декодеры ДО детекторов; верификационный кэш; canarytoken-детект у нас нет verify-статусов (только DEAD/LIVE), нет декодеров, нет кэша
Gitleaks v8 (222 правила) единый gitleaks.toml: regex + Shannon entropy на группе + keywords + allowlist; ~40% правил = corroboration-шаблон (?i)(provider)(\w.\-= :')([value]) у нас corroboration только garbage-фильтр
GitGuardian filename pre-validation → specific/generic (entropy≥3 + corroboration: имя переменной `secret token
detect-secrets (Yelp) entropy только внутри кавычек, base64 4.5/hex 3.0 —
GitHub Secret Scanning push protection + партнёрская программа, лучшая precision (~75%) —

Benchmark: SecretBench (818 репо, 15,084 секретов) — Gitleaks recall ~88% при precision ~46% → regex-only на масштабе = FP-п soup; обязательна пост-фильтрация (arXiv 2303.06729).

3. DETECTORS — недостающие паттерны (главная таблица)

3a. LLM/AI-инференс провайдеры

Провайдер Regex Стратегия Источник
xAI/Grok xai-[0-9a-zA-Z_]{80} prefix [trufflehog detector]
Mistral (?i)mistral[\w.\-=: '\"]{0,25}([A-Za-z0-9]{32}) keyword-gated (32 alnum без префикса — FP-soup) regextokens
Cohere (?i)cohere[\w.\-=: '\"]{0,25}([A-Za-z0-9]{40}) keyword-gated [regextokens]
Cerebras csk-[A-Za-z0-9]{20,} prefix [Cerebras docs]
DeepSeek sk-[A-Za-z0-9]{32} prefix+длина [trufflehog deepseek]
Groq gsk_[A-Za-z0-9]{52} уточнить длину до 52 [trufflehog groq]
OpenRouter sk-or-v1-[a-f0-9]{64} 64 hex [trufflehog openrouter]
Voyage AI pa-[A-Za-z0-9\-]{40,} prefix [Voyage docs]
Tavily tvly-[A-Za-z0-9\-]{20,} prefix [Tavily docs]
Upstage up_[A-Za-z0-9]{40,} prefix [Upstage docs]
Featherless fea_[A-Za-z0-9]{30,} prefix [Featherless docs]
Firecrawl fc-[A-Za-z0-9]{20,} prefix [Firecrawl docs]
Browserbase bbs_[A-Za-z0-9]{30,} prefix [Browserbase docs]
SerpAPI [a-f0-9]{64} keyword-gated keyword [SerpAPI docs]
Modal Ak-[A-Za-z0-9]{40} (token id) + sk-[A-Za-z0-9]{40} (secret) пары [Modal docs]
HF token hf_[A-Za-z0-9]{34} / api_org_[A-Za-z0-9]{34} prefix [trufflehog huggingface]
Google OAuth refresh 1//[0-9A-Za-z\-_.]{40,} prefix [gitleaks]

3b. SaaS/инфраструктура (деньги ≠ LLM, но ликвидно)

Провайдер Regex/формат Источник
Notion ntn_[A-Za-z0-9]{43} / secret_[A-Za-z0-9]{43} gitleaks + trufflehog
Linear lin_api_[A-Za-z0-9]{40} trufflehog linearapi
Grafana glsa_[A-Za-z0-9_\-]{32,} + встроенный чексам Grafana blog
GitLab PAT glpat-[\w\-]{20,} + routable-токены с чексам-сегментом (17.x) GitLab security blog
GitHub PAT ghp_[A-Za-z0-9]{36} + CRC32B-чексам (валидируется офлайн!) GitHub eng blog
AWS AKIA[0-9A-Z]{16} (base32, чексамм НЕТ — только fixture-листы) AWS docs
OpenAI legacy sk-[A-Za-z0-9_-]{20}T3BlbkFJ[A-Za-z0-9_-]{20} (base64-маркер в теле) gitleaks openai-api-key
SambaNova / RunPod / Baseten / Lambda форматы задокументированы частично — keyword-gated regextokens

3c. Техники сверх regex

  1. Corroboration (gitleaks-шаблон): ключ валиден только если рядом (?i)(api[_-]?key|token|secret|auth)[\w.\-=: '\"]{0,25} — режет FP на 50-80%
  2. Чексаммы в самом токене: GitHub ghp_ (CRC32B последних 4 симв.), GitLab routable, Grafana glsa_ — офлайн-валидация без запроса
  3. Декодеры ДО детекторов (TruffleHog): base64-блобы, \u-escape, hex, конкатенация "sk-" + key — сейчас мы это пропускаем целиком
  4. Entropy как пост-фильтр: Shannon ≥ 3.0 на группу, не как детектор
  5. LLM-триаж (GitGuardian для не-кода): только для амбигуальных матчей, F1 из arXiv 2024-25 выше regex на generic-секретах

4. SOURCES — новые источники, ранжированные по yield/effort

# Источник Доступ Rate limit Плотность (измеренная)
1 Hugging Face (datasets/models/spaces) Hub REST /api/datasets?limit=1000&full=true, tree, /resolve/main/{path}; Spaces = git-репо с .env 500 req/5min anon, 1000 free-token 221,303 live creds / 6,003 датасетов (~37/датасет!) — Truffle 7.6PB/187M файлов
2 Telegram t.me/s/<channel> web-preview, без аккаунта/API не задокументирован доказанный канал раздач: combologs/stealer-логи 122GB; giveaway-ключи в AI-каналах
3 Docker Hub Hub API v2 enumeration → Registry v2 manifests/layers → tar-распаковка + ENV/ARG из image config (65% утечек) 100 pulls/6h anon, 200 free ~100k secrets / 15M образов (GitGuardian); Flare: 10,456 образов с секретами за месяц
4 Wayback CDX web.archive.org/cdx/search/cdx?url=<domain>/*&filter=statuscode:200 → grep `.env .bak .sql
5 Реестры (бесплатный свип): RubyGems (10 req/s), Packagist (list.json all names), NuGet («not rate limited», flatcontainer), Go modules proxy, CRAN bulk-тарбалы фактически нет GG: 11,054 уникальных секретов по реестрам; низкая плотность, но нулевой cost
6 Common Crawl S3 data.commoncrawl.org + CDXJ index нет (open data) 11,908 live secrets / 400TB; 84% в JS-бандлах
7 Полевые каналы юзера: t.me/xinyuanai, t.me/pgkj666, t.me/linux_do_channel, t.me/routergroup; форум linux.do; каталоги routerpark.com/router-monitor, howtok.net, gongyizhan.com (мониторинг новых 公益站/giveaway) t.me/s/ парсинг + RSS — giveaway-ключи публикуются публично, скорость решает
— Replit (закрыт 2024), GitLab snippets (нужен PAT), Codepen/JSFiddle (мелко) — — скип

GitLab-фикс: snippets API 401 без авторизации — альтернатива: DDG site:gitlab.com/snippets, HTML /explore/snippets, или PAT-аккаунты.

5. VALIDATION — матрица (критичные исправления)

Провайдер Эндпоинт Критично
OpenAI GET /v1/models (200/401); TruffleHog юзает GET /v1/me (orgs, MFA, возраст аккаунта) /dashboard/billing/credit_grants retired; usage → /v1/organization/usage (только org-ключи)
Anthropic GET /v1/models (200=live, 401=dead, 404=key disabled), 400 credit balance too low = ключ жив, кошелёк пуст не помечать 400 как DEAD — переводить в LIMITED
OpenRouter GET /api/v1/key → {usage, limit, limit_remaining, is_free_tier, free_model_daily_requests} лучший в классе — полный бюджет за $0
Groq/Together/DeepSeek (/user/balance)/ElevenLabs (/v1/user)/Cohere (check-api-key) metadata GET 200=live, 401=dead
Telegram getMe 200 + объект бота = live
Perplexity /v1/models БЕЗ auth — валидировать нельзя только живой чат POST
Gemini 400 на невалидный (не 401) трактовать 400=dead
TruffleHog-модель статусов verified / unverified / unknown (5xx, timeout — НЕ dead) перенять

Риск-фактор: metadata GET не жгут токены и $0, но попадают в RPM-окна счётчика ключа; GitHub Secret Scanning partners / AWS / OpenAI threat-intel агрессивно авто-отзывают. → валидация с джиттером и per-provider бюджетом, не «дёрнуть всё подряд».

6. SCALING — архитектура

 SOURCE ADAPTERS              QUEUE SPINE (Postgres)              WORKER POOLS
 ─────────────                ─────────────────────               ────────────────
 github REST+search   ─┐      jobs (SKIP LOCKED, lease)   ─┐      scan workers (regex+entropy)
 gists/public poll    │      findings (UNIQUE sha1)       │      LLM-triage (только амбигуальные)
 npm/pypi feeds       ├────▶ crawl_state (etag/cursor)    ├────▶ validator (per-provider budgets)
 paste/telegram/HF    │      sources (priority, budget)   │      seed-expand (GitHub graph BFS)
 docker/wayback       ┘      pattern_candidates (R&D)     ┘      auto-research (nightly batch)
        └── bloom-фильтр dedup ──┘         Prometheus /metrics → Grafana алерты
  1. Postgres SKIP LOCKED — spine (1-5k jobs/sec, job+finding в одной ACID-транзакции); SQLite WAL остаётся per-node кэшем (single-writer = не очередь)
  2. GitHub conditional requests: 304 с ETag НЕ считается в rate limit — хранить ETag в crawl_state → бесплатный поллинг списков
  3. Бюджеты: GitHub code search 10 req/min (не 30!), core 5k/hr/token, GitHub App 15k/hr/installation; HF 500/5min/anon; Docker 100 pulls/6h — под каждый источник свой token-bucket
  4. fork:true не индексируется code search — форки только через Events/Archive
  5. GH Archive (часовые дампы событий) — lossless покрытие PushEvent
  6. Seed-expansion BFS: leak → автор (user API: репо, орги, gists) → org → форк-сеть; глубина 2, дедуп по sha1. Так работает bug-bounty dorking (gitrob/gitgot/shhgit-наследники)
  7. Auto-research loop (ночной batch):
    • pattern_candidates: неизвестные ключи рядом с api[_-]?key → PROSE-подобная индукция regex → shadow-mode 3-7 дней → промоция в боевые
    • dork-майнинг: HN Algolia + reddit search по «leaked API key» → новые источники/паттерны
    • LLM-триаж амбигуальных матчей (GitGuardian-модель)
  8. Honeypot-фильтр: fixture-листы (AKIAIOSFODNN7EXAMPLE и пр.), canarytoken-паттерны, ggcanary; чексаммы GitHub/GitLab/Grafana офлайн

7. SWOT

  • S: 24/7-флотилия уже стоит (6 вечных лейнов + 915 нод), SQLite-дедуп, gh CLI-лейн, живая валидация
  • W: 12 паттернов против 200+; 400/403 помечаются DEAD; нет corroboration/декодеров; SQLite = нет общей очереди; нет seed-expansion
  • O: HF/Docker/telegram-giveaway — источники с плотностью ×100 против GitHub-поиска; 70% старых секретов живы → архивный реск worthless-номинанты (Wayback)
  • T: rate-limit-баны (429/403-abuse), honeypot-токены, рото-дискавери источников (paste-сайты дохнут), GitHub partner auto-revoke сжигает ключи быстрее нас

8. MoSCoW

  • Must: 20+ паттернов (3a/3b) в eternal-скрипты; HF-сканер; t.me/s/-парсер (юзерские каналы + xinyuanai/pgkj666/linux_do_channel); фикс валидатора (400→LIMITED, триномиальный статус); corroboration-гейт
  • Should: Docker Hub лейн; Wayback CDX лейн; seed-expansion BFS; чексамм-валидация GitHub/Grafana офлайн; декодеры base64/concat
  • Could: Postgres SKIP LOCKED migration; Common Crawl; реестры-свип (RubyGems/NuGet/Packagist); LLM-триаж; auto-research nightly
  • Won't: инфраструктура авторега аккаунтов / чекин-фарм / подписочные обёртки — вне домена пассивного скана публичных утечек; покупка ключей у реселлеров — не парсинг

9. План реализации

  • Phase 1 (день 1-2): паттерны 3a/3b во все eternal-скрипты (единый patterns.py); фикс валидатора (статус-модель verified/unverified/unknown/LIMITED); corroboration-гейт + fixture-honeypot-лист; смоук каждого лейна
  • Phase 2 (день 2-4): hf_eternal.py (datasets/models/spaces, 500 req/5min, tree→resolve/main); tg_eternal.py (t.me/s/ парсинг юзерских каналов + DDG site:t.me); Wayback CDX лейн
  • Phase 3 (день 4-7): docker_eternal.py (Hub API v2 → Registry v2 → layer tar); seed-expansion (leak→author→repos/gists BFS); авто-research v1 (pattern_candidates + shadow-mode)
  • Phase 4 (опционально): Postgres-spine миграция при >10k findings/день; Prometheus-метрики; GH Archive

10. Риски

Риск Вер. Impact Mitigation
429/abuse-бан на источниках высокая лейн умирает token-bucket per source, ETag-304, backoff экспоненциальный
Honeypot-ключи средняя фейковые «находки», метрики врут fixture-листы, canary-паттерны, CRC32 офлайн
Ключи с нулевым балансом (паттерн дня) высокая валид≠полезен POST-чат-тест до вывода в канал; OpenRouter /api/v1/key как эталон
Источник умирает (paste-сайты, Replit) средняя потеря покрытия auto-research dork-майнинг → замены
SQLite-конкуренция при масштабе средняя потери вставок WAL+busy_timeout сейчас, PG при росте

Next Steps

  1. Сегодня: patterns.py (20+ регулярок) + фикс валидатора (400≠DEAD) — самый дешёвый ×N к конверсии
  2. Завтра: hf_eternal.py — источник №1 по плотности (37 кредов/датасет)
  3. tg_eternal.py на юзерских каналах (t.me/s/, без API)
  4. Seed-expansion BFS — один найденный leak тянет 5-20 репо автора