
정적 구조화 텍스트에서 하드코딩된 비밀정보를 식별합니다.

"내 작은 새들은 어디에나 있어, 북쪽에도 있지. 그들은 나에게 가장 이상한 이야기들을 속삭여." - 바리스 경
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에는 여러 구성 옵션이 있습니다. 파일 경로, 키 또는 값을 기준으로 결과를 포함/제외할 수 있습니다. 파일 경로 지정은 glob으로 해석됩니다. 키와 값은 정규식 및 기타 여러 매개변수를 허용합니다. 기본 제공되는 기본 구성 파일이 있으며, 사용자 정의 파일을 제공하지 않으면 이 파일이 사용됩니다.
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: AWS 세션 토큰처럼 형식화된 값
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"