
🔎 코드에서 Trojan Source 취약점을 찾는 데 도움을 줍니다 👀 . 여러 협력자가 있는 프로젝트(CI/CD)에서 코드 리뷰에 유용합니다.
Trojan Source 취약점은 공격자가 악성 코드를 무해한 것처럼 보이게 할 수 있습니다. 일반적으로 공격자는 자신의 코드를 (시각적으로) 주석으로 위장하여 유인합니다. 이는 많은 언어에 영향을 미치기 때문에 심각한 위협입니다. 여러 '신뢰할 수 없는' 소스가 있는 프로젝트가 영향을 받을 수 있습니다.
악성 코드 탐지 🔎
·
악성 코드 추적 👀
·
Trojan Source ❓
go로 설치> go install을 통해
go install github.com/ariary/TrojanSourceFinder/cmd/tsfinder@latest
$GOPATH가 $PATH에 있는지 확인하십시오.
> 소스에서
git clone https://github.com/ariary/TrojanSourceFinder
cd TrojanSourceFinder
make before.build
make build.tsfinder
make build.tsfinder 명령이 실패하면 다음을 시도하세요:
env GOOS=target-OS GOARCH=target-architecture
go build -o tsfinder cmd/main.go
curl로 설치> 릴리스에서
curl -lO -L https://github.com/ariary/TrojanSourceFinder/releases/latest/download/tsfinder && chmod +x tsfinder
> 수동 코드 리뷰 또는 CI/CD 파이프라인에서 Trojan Source 탐지를 도와줍니다 (유니코드 양방향 문자)
파일 또는 디렉토리 *<path>*에서 Trojan Source를 탐지하려면:
tsfinder [path]
> 소스 코드 파일은 일반적으로 텍스트 파일입니다. 바이너리를 스캔에서 제외하면 오탐지를 줄이는 데 도움이 됩니다.
tsfinder -t [path]
-v를 추가하면 스캔에서 건너뛴 파일을 확인할 수 있습니다.
Trojan Source는 새로운 것도 아니고 유일한 위험도 아닙니다. 또 다른 하나는 '호모글리프(Homoglyph)'입니다.(무엇인가요?)
tsfinder는 homoglyph 명령으로 이를 탐지하는 데 도움을 줍니다:
tsfinder homoglyph [filename] [flags]
--sibling 플래그를 사용하여 path에서 발견된 호모그래프에 대해 동일한 '뼈대'를 가진 단어(형제)가 있는지 확인할 수 있습니다:
tsfinder homoglyph [filename] --sibling [path]
다른 프로젝트에 주로 의존하는 개발 중인 기능입니다
> 코드가 실제로 기계/컴파일러에 의해 어떻게 해석되는지 시각화합니다
tsfinder는 의도적으로 매우 장황하지 않습니다. 기본적으로 Trojan Source 코드가 감지된 경우에만 출력됩니다. 더 많은 상세 정보를 원하고 위험한 줄을 시각화하려면 -v 플래그를 추가하세요.
Trojan Source가 있는 위치를 더 잘 보려면 -c 플래그로 색상 출력을 활성화할 수 있습니다 (디렉토리 스캔에도 유용):
tsfinder -c -v <directory>


@ioah86가 여기에서 언급했듯이, trojan source는 grep을 사용한 한 줄 명령으로도 탐지할 수 있습니다.
큰 차이점은 출력 형식과 종료 상태 코드입니다 (tsfinder는 Trojan Source가 발견되지 않으면 상태 코드 0을, 그렇지 않으면 1을 반환합니다; grep은 반대입니다).
또한 이 한 줄 명령은 호모글리프 문제를 해결하지 못합니다.
| 목표 | tsfinder | grep one-liner |
|---|
| 모든 파일 스캔 + 줄 표시 | tsfinder -v . | grep -arE $'(\u2066|\u2067|\u2068|\u202A|\u202B|\u202D|\u202E|\u202C|\u2069|\u200E|\u200F|\u061C|\u2066|\u2067|\u2068)' |
| 사람이 읽을 수 있는 파일만 스캔 | tsfinder -t . | grep -IrE $'(\u2066|\u2067|\u2068|\u202A|\u202B|\u202D|\u202E|\u202C|\u2069|\u200E|\u200F|\u061C|\u2066|\u2067|\u2068)' |
| 발견 시 상태 코드 1로 종료 | 기본 동작 | [one-liner] && exit 1 || exit 0 |