

「私の小鳥たちはどこにでもいる。北でも、彼らは私に最も奇妙な物語を囁く。」 - ヴァリス卿
Whispersは、ハードコードされた認証情報や危険な関数を検索するために、さまざまな一般的なデータ形式を解析するように設計された静的コード解析ツールです。WhispersはCLIで実行することも、CI/CDパイプラインに統合することもできます。
Whispersは、構造化テキストパーサーであり、コードパーサーではありません。
現在サポートされている一般的なフォーマットは以下の通りです:
Python3ファイルは、ネイティブ言語サポートによりASTとして解析されます。
以下の言語ファイルはテキストとして解析され、一般的な変数宣言と代入パターンがチェックされます:
pip3 install whispers
git clone https://github.com/Skyscanner/whispers
cd whispers
make install
whispers --help
whispers --info
whispers source/code/fileOrDir
whispers --config config.yml source/code/fileOrDir
whispers --output /tmp/secrets.yml source/code/fileOrDir
whispers --rules aws-id,aws-secret source/code/fileOrDir
whispers --severity BLOCKER,CRITICAL source/code/fileOrDir
whispers --exitcode 7 source/code/fileOrDir
from whispers.cli import parse_args
from whispers.core import run
src = "tests/fixtures"
configfile = "whispers/config.yml"
args = parse_args(["-c", configfile, src])
for secret in run(args):
print(secret)
Whispersにはいくつかの設定オプションがあります。ファイルパス、キー、または値に基づいて結果を含める/除外することが可能です。ファイルパスの指定はグロブとして解釈されます。キーと値は正規表現やその他のパラメータを受け付けます。カスタム設定ファイルを提供しない場合に使用されるデフォルトの設定ファイルが組み込まれています。
config.ymlは以下の構造を持つ必要があります:
include:
files:
- "**/*.yml"
exclude:
files:
- "**/test/**/*"
- "**/tests/**/*"
keys:
- ^foo
values:
- bar$
rules:
starks:
message: Whispers from the North
severity: CRITICAL
value:
regex: (Aria|Ned) Stark
ignorecase: True
検出を調整する(つまり、誤検知や不要な結果を削除する)最も早い方法は、デフォルトのconfig.ymlを新しいファイルにコピーし、それを適応させてWhispersに引数として渡すことです。
whispers --config config.yml --rules starks src/file/or/dir
ルールは、キーと値のペアから実際に抽出すべきものを指定します。AWSキーやパスワードなどの一般的なルールが組み込まれていますが、新しいルールで簡単に拡張できるように設計されています。
rules:以下で定義できます。rule-id: # 一意のルール名
description: Values formatted like AWS Session Token
message: AWS Session Token # レポートに表示されるメッセージ
severity: BLOCKER # BLOCKER, CRITICAL, MAJOR, MINOR, INFO のいずれか
key: # キーの形式を指定
regex: (aws.?session.?token)?
ignorecase: True # 大文字小文字を区別しない
value: # 値の形式を指定
regex: ^(?=.*[a-z])(?=.*[A-Z])[A-Za-z0-9\+\/]{270,450}$
ignorecase: False # 大文字小文字を区別する
minlen: 270 # 値の最小長
isBase64: True # 値がBase64エンコードされている
isAscii: False # デコードするとバイナリデータになる
isUri: False # URI形式ではない
similar: 0.35 # キーと値の最大許容類似度(1.0で完全一致)
すべての解析機能はプラグインを介して実装されています。各プラグインは、ファイルをスキャンしてルールでチェックされるキーと値のペアを返すpairs()メソッドを持つクラスを実装します。
class PluginName:
def pairs(self, file):
yield "key", "value"