シークレットスキャナ・マスクツールの既知の落とし穴
一言まとめ
Gitleaks・TruffleHog・secretlint・1Password op run・Teller・Warp・GitHub Actions add-mask それぞれに、Issue として公開された構造的な欠陥がある。導入前に「誤検知の扱い」「TTY を壊すか」「配布バイナリの依存」を確認する。
目次 5 sections
調査時点: 2026-04。Issue 番号と状態は当時のもの。以後に修正された可能性がある。
ツール別
| ツール | 方式 | 既知の欠陥(Issue) |
|---|---|---|
| Gitleaks | pattern 検出 | --redact を付けると検出数が減る(#332 / #367)。--redact と --baseline の併用でベースラインが無視される(#1441)。generic-api-key ルールが os.getenv('AWS_SECRET_ACCESS_KEY')・public_key=...・LLM_SECRET_NAME などを誤検知(#575 / #1578)。v8.20.1 → v8.24.3 で設定変更なしに誤検知が急増し、辞書語がランダムな認証情報より高いエントロピースコアを得る逆転(#1830)。pnpm-lock.yaml のハッシュ誤検知(Discussion #1005)。Kubernetes Sealed Secrets の誤検知(#1728)。インラインの無視コメントに未対応で pre-commit がコミットをブロック(#579) |
| TruffleHog | pattern 検出 | 誤検知と判定した候補がログにも出ず黙って除外され、理由を追えない(#3578)。複数 detector が同じ値を検出すると verificationOverlapWorker() が既知の誤検知フィルタを迂回して結果に含める(#2888)。pre-commit フックがソースからビルドする設計でインストールに数分かかる(#4281)。スキャンが資源集約的 |
| secretlint | pattern 検出(ルール追加が前提) | --secretlintignore .gitignore が直感に反し --gitignore を要求される(#337)。Windows + GitHub Actions で AggregateError: secretlint loading errors(#205)。npm ルールに ReDoS 脆弱性があり http:// 始まりの長い文字列でスキャンが極端に遅くなる(#296)。ビルトインルールがなく、パッケージ導入と .secretlintrc 追記が必要 |
1Password op run | known-value マスク + サブプロセス実行 | マスク有効時に stdout / stderr が非 TTY 化する(公式が「ストリームを中継するため色の自動検出が効かない」と明言)。色が消える(shell-plugins #413)、TUI が真っ白になる(crush #1415)、Ansible が各 fork で setsid を呼び TTY を切り離すため連携できない。回避策は --no-masking だけで、マスクの完全無効化と二律背反 |
| Teller | known-value redact(設定ファイル必須) | 配布バイナリが libssl.so.1.1 に依存し、OpenSSL 3.x 系の Linux(Ubuntu 22.04+ / Debian 12 / Arch)で version OPENSSL_1_1_1 not found と即死(#290。公式ドキュメントに依存の記載なし、修正 PR なし)。v1 → v2 の自動アップグレードで全設定が動かなくなり、changelog・移行ガイドなし(#282)。GCP Secret Manager プロバイダ破損(#309)、AWS SSM SecureString 取得失敗(#310)、Vault namespace 指定不可(#286)。最終リリース v2.0.7(2024-05-20)以降メンテが停滞し、コンパイル不可報告(#312)や CNCF アーカイブ問い合わせ(#315)に応答なし |
| Warp redaction | pattern(描画レイヤー) | デフォルト無効(#6113)。無効にしてもコピー時はマスクされる不整合(#5574)。Session Sharing には非適用(公式明記)。正規表現が大文字小文字を区別し password が Password に一致しない。変数名(キー名)でのリダクションに未対応で、デモ録画用途に足りない(#3636) |
GitHub Actions add-mask | known-value マスク | ジョブ間でシークレットを渡すと受け取り側でマスクされない(runner #2701)。add-mask を呼ぶ前に同じ値がログに出ていればマスクされない(#475)。workflow_dispatch の入力値をマスクできない(#643) |
Grafana Alloy loki.secretfilter | pattern(Gitleaks の定義を流用) | スタンドアロン CLI ではなくコンポーネント。大規模ログでパフォーマンス問題(alloy #3694) |
ログ露出のインシデント例
「サブコマンドの stdout がロガーを通らずに秘匿値が出る」という型の問題は各所で起きている。
- Grafana Tanka
tk applyが CI ログに全シークレットを出力(tanka #512) kubectl diffの出力に Secret が露出(kubernetes #87840)- Airflow タスクの stdout がロガーを経由せずマスク漏れ(PR #24362 で対応)
- Tekton の entrypoint がサブコマンドの stdout / stderr を素通しし、
set -xで秘匿値が露出(#3373) - Azure CLI のデバッグモードでパスワードが露出(azure-cli #20959)
導入前の確認項目
- 誤検知をどう扱うか(インライン無視、baseline、除外理由の可視化)
- 子プロセスの TTY を壊すか(色・TUI・対話入力・Ansible)
- 配布バイナリの動的リンク依存(libssl など)とメンテ状況(最終リリース日、Issue への応答)
- マスク対象の値が「マスク登録前」にログに出る経路がないか
関連
更新履歴
- 2026-04-16: 初版(ローカル調査ノート)
- 2026-10-17: Wiki へ移植、概念ページとして再構成
出典
- https://github.com/zricethezav/gitleaks/issues/332
- https://github.com/gitleaks/gitleaks/issues/1830
- https://github.com/trufflesecurity/trufflehog/issues/3578
- https://github.com/trufflesecurity/trufflehog/issues/2888
- https://github.com/secretlint/secretlint/issues/296
- https://developer.1password.com/docs/cli/reference/commands/run/
- https://github.com/tellerops/teller/issues/290
- https://github.com/warpdotdev/Warp/issues/6113
- https://github.com/actions/runner/issues/475
- https://github.com/actions/runner/issues/2701