
正規表現ルール、レキサーによるセマンティック分析、ハッシュ値マッチングを組み合わせ、コード内に露出した認証情報を検出するオフラインシークレットスキャナー。SARIF出力に対応。
絶対に違います!
LLM ブームの時代においても、DeepSecrets は完全にあなたのマシン上で動作します — オフラインで、安全に、そして無料で優れた結果を提供します。
既存のスキャナーのほとんどは、実際にはコードを「理解」していません。代わりにテキストを解析するだけで、カバレッジも不十分です。
DeepSecrets は、従来の正規表現スキャナーと本格的な商用 SAST ツールの間のギャップを埋めます。セマンティックコード解析、危険な変数の検出、コンテキスト認識型のエントロピー解析に大きく依存することで、従来の正規表現ベースのスキャン戦略を拡張しています。 これにより、シークレット候補は常に意味的に正しくなります。字句解析と構文解析の技術を用いて、500 以上の言語とフォーマットにわたる真のコード理解を実現しています。
DeepSecrets はまた、知識ゼロで認証情報を見つける新しい方法である HashedSecret Engine を導入しています。既知の本番シークレットのハッシュ値さえ提供すれば、ツールがコード内で平文として露出しているそれらを発見します。
DeepSecrets v2.0 は (2026年6月に) SecretBench ベンチマークに対して評価され、従来のフラットテキストスキャナーを上回る性能を示しました:
(内部の詳細なストーリーとベンチマークの内訳は、私の HackerNoon の記事 こちら で読むことができます)
Github から pip 経由で
$ pip install git+https://github.com/ntoskernel/deepsecrets.git
PyPi から
$ pip install deepsecrets
DeepSecrets には Python 3.11 以降が必要です。
スキャンを実行する最も簡単な方法は次のとおりです:
$ deepsecrets --target-dir /path/to/your/code --outformat dojo-sarif --outfile report.json
これにより、デフォルト設定を使用して /path/to/your/code に対してスキャンが実行されます:
SARIF形式のレポート(DefectDojoおよびGitHub Securityと互換性あり)が report.json に保存されます。
--help コマンドはいつでもガイドとして利用できますが、スキャンを環境に合わせて調整するために使用できる主なフラグは以下のとおりです:
--regex-rules /path/to/rules.json: 独自のカスタム正規表現ルールセットを指定します。--hashed-values /path/to/hashes.json: 既知の本番シークレットを事前にハッシュ化したリストを提供し、安全に検索します。--excluded-paths /path/to/exclusions.json: スキャン中に無視されるデフォルトのパスを上書きまたは拡張します。--deep-max-size BYTES: このサイズ(デフォルト 250,000 バイト)を超えるファイルは高速分析の対象となります。つまり、言語レキサーを使用せずに正規表現ルールと変数検索のみを実行します。大きなファイルはほとんどが生成物またはミニファイされたものであり、レキサーはそれらのスキャン時間の大部分を占めるにもかかわらず、それ以上を見つけることはほとんどありません。0 を指定すると、すべてのファイルに対して完全な分析が実行されます。--skip-bundles: 他のパス除外に加えて、ミニファイされたJavaScript、ソースマップ、バンドル(*.min.js、*.map、*.bundle.js)を完全にスキップします。--confidence-level {all,low,medium,high,very-high}: 報告する最低信頼度(デフォルトは low、すべての検出結果)。medium、high、very-high はそれぞれ信頼度 3、6、9 以上を保持します。all はスキャナーがシークレットではないと判断した正規表現の一致(プレースホルダー、例)も -INFO ルールID付きで報告します。--report-diagnostics: ターゲット下で見つかったすべてのファイルを、そのステータス、スキャン時間、スキップ理由、分析の深さとともにSARIFレポートに追加します。--regex-candidate-scoring-rules /path/to/rules.json: 正規表現の一致が報告される前にそれを判定するための独自のルールを指定します。フラグに値を指定しない場合、正規表現の一致は判定なしで報告されます。--multiprocessing-context {forkserver,spawn,fork}: ワーカープロセスの起動方法。プラットフォームが対応している場合(Linux、macOS)のデフォルトは forkserver です。ワーカーはサーバープロセスにすでにロードされているスキャナーを共有します。Windowsでは spawn を使用します。3つすべてが同じ検出結果を返します。--disable-masking: 出力レポートで潜在的なシークレットをマスクせずに保持します (以下の注意を参照)。--ci / --no-ci: CIモードをオンまたはオフにします。CIモードでは、ライブ進捗表示の代わりに30秒ごとにプレーンな進捗行を出力します。CIサービス(GitHub Actions、GitLab CI、Jenkinsなど)内では自動的にオンになり、出力がターミナルでない場合にもオンになります。例 .github/workflows/deepsecrets.yml
name: DeepSecrets Scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install DeepSecrets
run: pip install deepsecrets
- name: Run Scan
run: deepsecrets --target-dir . --outformat dojo-sarif --outfile report.sarif
continue-on-error: true
- name: Upload SARIF report
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: report.sarif
v1.3.0 以降、パイプラインの成果物を保護するため、レポート内の潜在的なシークレットは自動的にマスキングされます。必要に応じて --disable-masking フラグでこれを無効にできます。
マスキングは、レポート内の partialFingerprints セクションが生データに基づいて正しく設定されるため、ダウンストリームのプラットフォーム(GitHub など)の重複排除ロジックを壊しません。
[!Caution]
マスキングを無効にして DeepSecrets を CI パイプラインに統合すると、CI ログや成果物の中でシークレットが再び漏洩する可能性が高くなります。
すべての検出結果には信頼度スコアが付与されます。ただし、セキュリティプラットフォームによって SARIF メトリクスの解析方法は異なります。最新の ASPM ダッシュボード間での互換性を確保するため、DeepSecrets は次の処理を行います:
仮想サブルール (rules[]): 信頼度の階層ごとにルールを動的に生成します。S105-LOW から -MEDIUM、-HIGH を経て S105-VERY-HIGH まで(および --confidence-level all でレポートされる拒否されたマッチには -INFO)です。これにより、GitHub Security や DefectDojo はネイティブパーサーを壊すことなく、セマンティックな精度のばらつきを適切にマッピングできます。
決定的な結果レベル: このツールは常に results[] モデルで level: error を明示的に設定します。これは CI/CD パイプラインや古い SAST パーサーに対する汎用的なフォールバックとして機能し、個々のルールの解釈に関係なく、露出したシークレットが確実にビルドを失敗させたり Pull Request をブロックしたりするようにします。
コンテキストメッセージ: 生の数値による信頼度スコアを result.message.text にネイティブに注入するため、セキュリティアナリストはダッシュボード上でそれをすぐに確認できます。
regex チェック用の組み込みルールセットは /deepsecrets/rules/regexes.json にあります。この形式に従ってカスタムルールセットを自由に作成できます。
ハッシュ化チェック用のルールセットの例は /tests/fixtures/hashed_secrets.json にあります。この形式に従ってカスタムルールセットを自由に作成できます。
既知の本番シークレットをリポジトリ内で平文として露出させることなく検索するには、それらのハッシュを含む JSON を提供します:
[
{
"name": "KNOWN-PROD-DATABASE-PASSWORD",
"hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"length": 12,
"algorithm": "sha1"
}
]
--hashed-values /path/to/hashes.json を付けて実行します。DeepSecrets は字句解析ステージ中に文字列候補をオンザフライで自動的にハッシュ化し、それらと照合します。
ふん、まだ正規表現ベースなの?
はい、そして違います。もちろん、他のツールと同様に型付きシークレットを見つけるために正規表現を使用します。しかし、言語理解(字句解析ステージ)と変数検出も内部的には正規表現を使用しています。正規表現は道具であり、問題ではありません。問題は、意味的な文脈なしに正規表現を盲目的に適用することです。
でも Semgrep Secrets はどうなの? 彼らのものをクローンしているように見えるけど。
DeepSecrets はもともと 2023 年 4 月にリリースされました — Semgrep Secrets のローンチの 6 か月前です。私たちは類似した原則を共有していますが、DeepSecrets は 100% 無料/オープンソースであり、大幅に広範な多言語トラッキングサーフェスを活用しています。
他のツールが知っているものだけをスキャンするのに対し、DeepSecrets はレキサーを活用します。これにより、ベンチマークがデータセットを持たない可能性のある稀な設定フォーマットやカスタムコードブロック内に隠された危険な認証情報を浮き彫りにすることができます。
| 機能 / 能力 | DeepSecrets 2.2 | Gitleaks | TruffleHog | Semgrep Secrets |
|---|---|---|---|---|
| SecretBench 精度 | 93% 再現率 79% 適合率 | 88% 再現率 46% 適合率 | 52% 再現率 6% 適合率 | 未評価 |
| 価格とライセンス | 無料 / オープンソース | 無料 / オープンソース | 無料 / オープンソース | 商用 / 有料 |
| 分析タイプ | セマンティック / 正規表現 | フラットテキスト正規表現 / エントロピー | フラットテキスト正規表現 / エントロピー | セマンティック |
| 言語サポート | 500+ | 文脈非依存(テキスト) | 文脈非依存(テキスト) | 限定的なサブセット |
| 事前ハッシュ化検証 | はい(ハッシュエンジン経由) | いいえ | いいえ | いいえ |
| 文脈認識エントロピー | はい(代入値) | いいえ(ファイルテキスト全体) | いいえ(ファイルテキスト全体) | はい |
| 高度な SARIF 出力 | はい(動的信頼度) | 基本 | 基本 | はい |
なぜ真の抽象構文木を構築しないの? 学術的にはそちらの方が正しいはずでしょ!
DeepSecrets は複雑さと効果のバランスを保とうとしています。500 以上の言語にわたって真の AST を構築することは信じられないほど複雑で、シークレット検出には単純に過剰です。このツールはコード分析に汎用的な SAST アプローチに従いますが、AST ステージを最大速度と広さのために最適化しています。
独自のセマンティックルールを作りたい。どうすればいい?
セマンティックルールは現在、実質的に「変数評価ルール」です。こちらで確認できます。
まだ質問があります
pyproject.toml に記載されているメールアドレスを使用して、開発者に直接お気軽にご連絡ください。
いくつかの主要な概念があります:
FileTokenizerTokenEngineFindingScanMode管理に必要なすべてのメソッドを備えた、ファイルの Python 的な表現です。
ファイルの内容をそのロジックに従って断片 — トークン — に分割します。利用可能なトークナイザーは 4 種類あります:
FullContentTokenizer: すべての内容を単一のトークンとして扱います。正規表現ベースの検索に便利です。PerWordTokenizer: 与えられた内容を単語と改行で分割します。LexerTokenizer: 言語固有のスマートさを用いてコードを意味的に正しい断片に分割し、各トークンに追加の文脈を付与します。CheapVarDetectorTokenizer: セマンティック変数検出の限界をカバーするために、厳密な正規表現を使用します。その意味的役割、対応するファイル、およびファイル内の位置に関する追加情報を持つ文字列です。
独自のロジックによって単一のトークンに対するシークレット検索を実行するコンポーネントです。Finding のセットを返します。利用可能なエンジンは 3 種類あります: