Source code Review / SAST Tools

**htARTE(HackTricks AWS Red Team Expert)**で**ゼロからヒーローまでAWSハッキングを学ぶ**

HackTricksをサポートする他の方法:

ガイダンスとツールのリスト

マルチ言語ツール

PRのレビューに無料のパッケージがあります。

オープンソースツールです。

サポートされている言語

カテゴリ言語

GA

C# · Go · Java · JavaScript · JSX · JSON · PHP · Python · Ruby · Scala · Terraform · TypeScript · TSX

Beta

Kotlin · Rust

Experimental

Bash · C · C++ · Clojure · Dart · Dockerfile · Elixir · HTML · Julia · Jsonnet · Lisp ·

クイックスタート

# Install https://github.com/returntocorp/semgrep#option-1-getting-started-from-the-cli
brew install semgrep

# Go to your repo code and scan
cd repo
semgrep scan --config auto

VSCode内で結果を取得するには、semgrep VSCode Extensionを使用することもできます。

インストール可能な無料バージョンがあります。

クイックスタート

# Run the paltform in docker
docker run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9000:9000 sonarqube:latest
# Install cli tool
brew install sonar-scanner

# Go to localhost:9000 and login with admin:admin or admin:sonar
# Generate a local project and then a TOKEN for it

# Using the token and from the folder with the repo, scan it
cd path/to/repo
sonar-scanner \
-Dsonar.projectKey=<project-name> \
-Dsonar.sources=. \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.token=<sonar_project_token>

CodeQL

インストール可能な無料バージョンがありますが、ライセンスによると無料のCodeQLバージョンはオープンソースプロジェクトでのみ使用できます

インストール

# Download your release from https://github.com/github/codeql-action/releases
## Example
wget https://github.com/github/codeql-action/releases/download/codeql-bundle-v2.14.3/codeql-bundle-osx64.tar.gz

# Move it to the destination folder
mkdir ~/codeql
mv codeql-bundle* ~/codeql

# Decompress it
cd ~/codeql
tar -xzvf codeql-bundle-*.tar.gz
rm codeql-bundle-*.tar.gz

# Add to path
echo 'export PATH="$PATH:/Users/username/codeql/codeql"' >> ~/.zshrc

# Check it's correctly installed
## Open a new terminal
codeql resolve qlpacks #Get paths to QL packs

クイックスタート - データベースの準備

最初にやるべきことは、データベースの準備(コードツリーの作成)です。後でクエリを実行できるようにします。

  • コードqlにリポジトリの言語を自動的に識別させ、データベースを作成することができます

codeql database create <database> --language <language>

# Example
codeql database create /path/repo/codeql_db --source-root /path/repo
## DB will be created in /path/repo/codeql_db

通常、これは複数の言語が指定されたことを示すエラーをトリガーします(または自動的に検出されます)。 これを修正するための次のオプションを確認してください!

  • これを手動で行うことができます。リポジトリ言語を指定して(言語のリスト

codeql database create <database> --language <language> --source-root </path/to/repo>

# Example
codeql database create /path/repo/codeql_db --language javascript --source-root /path/repo
## DB will be created in /path/repo/codeql_db
  • もしリポジトリが1つ以上の言語を使用している場合は、各言語を示す1つのDBを作成することもできます。

export GITHUB_TOKEN=ghp_32849y23hij4...
codeql database create <database> --source-root /path/to/repo --db-cluster --language "javascript,python"

# Example
export GITHUB_TOKEN=ghp_32849y23hij4...
codeql database create /path/repo/codeql_db --source-root /path/to/repo --db-cluster --language "javascript,python"
## DBs will be created in /path/repo/codeql_db/*
  • codeqlにすべての言語を識別させ、言語ごとにDBを作成することもできます。GITHUB_TOKENを提供する必要があります。

export GITHUB_TOKEN=ghp_32849y23hij4...
codeql database create <database> --db-cluster --source-root </path/to/repo>

# Example
export GITHUB_TOKEN=ghp_32849y23hij4...
codeql database create /tmp/codeql_db --db-cluster --source-root /path/repo
## DBs will be created in /path/repo/codeql_db/*

クイックスタート - コードの分析

いよいよコードの分析の時間です

複数の言語を使用した場合は、指定したパスに言語ごとのDBが作成されていることを覚えておいてください。

# Default analysis
codeql database analyze <database> --format=<format> --output=</out/file/path>
# Example
codeql database analyze /tmp/codeql_db/javascript --format=sarif-latest --output=/tmp/graphql_results.sarif

# Specify QL pack to use in the analysis
codeql database analyze <database> \
<qls pack> --sarif-category=<language> \
--sarif-add-baseline-file-info \ --format=<format> \
--output=/out/file/path>
# Example
codeql database analyze /tmp/codeql_db \
javascript-security-extended --sarif-category=javascript \
--sarif-add-baseline-file-info --format=sarif-latest \
--output=/tmp/sec-extended.sarif

クイックスタート - スクリプト化

export GITHUB_TOKEN=ghp_32849y23hij4...
export REPO_PATH=/path/to/repo
export OUTPUT_DIR_PATH="$REPO_PATH/codeql_results"
mkdir -p "$OUTPUT_DIR_PATH"
export FINAL_MSG="Results available in: "

echo "Creating DB"
codeql database create "$REPO_PATH/codeql_db" --db-cluster --source-root "$REPO_PATH"
for db in `ls "$REPO_PATH/codeql_db"`; do
echo "Analyzing $db"
codeql database analyze "$REPO_PATH/codeql_db/$db" --format=sarif-latest --output="${OUTPUT_DIR_PATH}/$db).sarif"
FINAL_MSG="$FINAL_MSG ${OUTPUT_DIR_PATH}/$db.sarif ,"
echo ""
done

echo $FINAL_MSG

見つけた結果をhttps://microsoft.github.io/sarif-web-component/で視覚化するか、VSCode拡張機能SARIF viewerを使用できます。

また、VSCode拡張機能を使用して、VSCode内で結果を取得することもできます。手動でデータベースを作成する必要がありますが、その後は任意のファイルを選択して右クリック->CodeQL: Run Queries in Selected Filesをクリックできます。

インストール可能な無料バージョンがあります。

クイックスタート

# Install
sudo npm install -g snyk

# Authenticate (you can use a free account)
snyk auth

# Test for open source vulns & license issues
snyk test [--all-projects]

# Test for code vulnerabilities
## This will upload your code and you need to enable this option in: Settings > Snyk Code
snyk test code

# Test for vulns in images
snyk container test [image]

# Test for IaC vulns
snyk iac test

You can also use the snyk VSCode Extension to get findings inside VSCode.

It's Open Source, but looks unmaintained.

Supported Languages

Java (Maven and Android), Kotlin (Android), Swift (iOS), .NET Full Framework, C#, and Javascript (Node.js).

Quick Start

# Check the correct release for your environment
$ wget https://github.com/insidersec/insider/releases/download/2.1.0/insider_2.1.0_linux_x86_64.tar.gz
$ tar -xf insider_2.1.0_linux_x86_64.tar.gz
$ chmod +x insider
$ ./insider --tech javascript  --target <projectfolder>

パブリックリポジトリ向けに無料。

NodeJS

  • yarn

# Install
brew install yarn
# Run
cd /path/to/repo
yarn audit
npm audit
  • pnpm

# Install
npm install -g pnpm
# Run
cd /path/to/repo
pnpm audit
  • nodejsscan: Node.jsアプリケーション向けの静的セキュリティコードスキャナー(SAST)で、libsastsemgrepによってパワードされています。

# Install & run
docker run -it -p 9090:9090 opensecurity/nodejsscan:latest
# Got to localhost:9090
# Upload a zip file with the code
  • RetireJS: Retire.jsの目標は、既知の脆弱性を持つJSライブラリのバージョンの使用を検出することです。

# Install
npm install -g retire
# Run
cd /path/to/repo
retire --colors

Electron

  • electronegativity: Electronベースのアプリケーションでの設定ミスとセキュリティアンチパターンを特定するためのツールです。

Python

  • Bandit: BanditはPythonコードで一般的なセキュリティの問題を見つけるために設計されたツールです。 Banditは各ファイルを処理し、ASTを構築し、ASTノードに適切なプラグインを実行します。 Banditがすべてのファイルのスキャンを終えると、レポートが生成されます。

# Install
pip3 install bandit

# Run
bandit -r <path to folder>
  • safety: Safetyは、既知のセキュリティ脆弱性を持つPython依存関係をチェックし、検出された脆弱性に適切な修正を提案します。Safetyは、開発者のマシン、CI/CDパイプライン、および本番システムで実行できます。

# Install
pip install safety
# Run
safety check
  • Pyt: 未メンテナンス。

.NET

# dnSpy
https://github.com/0xd4d/dnSpy

# .NET compilation
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe test.cs

RUST

ラスト

# Install
cargo install cargo-audit

# Run
cargo audit

#Update the Advisory Database
cargo audit fetch

Java

FindBugs

FindBugsは、Javaプログラムのバグを見つけるための静的解析ツールです。FindBugsは、Javaのバイトコードを解析し、潜在的な問題を特定します。

PMD

PMDは、Javaコードの品質を向上させるための静的解析ツールです。PMDは、コードスタイルの問題や潜在的なバグを見つけるのに役立ちます。

# JD-Gui
https://github.com/java-decompiler/jd-gui

# Java compilation step-by-step
javac -source 1.8 -target 1.8 test.java
mkdir META-INF
echo "Main-Class: test" > META-INF/MANIFEST.MF
jar cmvf META-INF/MANIFEST.MF test.jar test.class
タスクコマンド

Jarファイルを実行

java -jar [jar]

Jarファイルを解凍

unzip -d [output directory] [jar]

Jarファイルを作成

jar -cmf META-INF/MANIFEST.MF [output jar] *

Base64 SHA256

sha256sum [file] | cut -d' ' -f1 | xxd -r -p | base64

署名を削除

rm META-INF/.SF META-INF/.RSA META-INF/*.DSA

Jarファイルから削除

zip -d [jar] [file to remove]

クラスを逆コンパイル

procyon -o . [path to class]

Jarファイルを逆コンパイル

procyon -jar [jar] -o [output directory]

クラスをコンパイル

javac [path to .java file]

Go

https://github.com/securego/gosec

PHP

PsalmPHPStan

Wordpress プラグイン

https://www.pluginvulnerabilities.com/plugin-security-checker/

Solidity

JavaScript

Discovery

  1. Burp:

  • Spider とコンテンツの発見

  • Sitemap > フィルタ

  • Sitemap > ドメインを右クリック > Engagement tools > スクリプトを検索

  • waybackurls <domain> |grep -i "\.js" |sort -u

静的解析

Unminimize/Beautify/Prettify

Deobfuscate/Unpack

注意: 完全に deobfuscate することができない場合があります。

  1. .map ファイルを見つけて使用する:

  • .map ファイルが公開されている場合、それらを使用して簡単に deobfuscate できます。

  • 一般的に、foo.js.map は foo.js にマップされます。手動でそれらを探してください。

  • それらを見つけるために JS Miner を使用します。

  • アクティブスキャンが実行されていることを確認します。

  • 'Tips/Notes' を読んでください。

  • 見つかった場合、deobfuscate するために Maximize を使用します。

  1. .map ファイルがない場合、JSnice を試してみてください:

  • ヒント:

  • jsnice.org を使用する場合、「Nicify JavaScript」ボタンの隣にあるオプションボタンをクリックし、「Infer types」を選択解除して、コードをコメントで混乱させないようにします。

  • スクリプトの前に空行を残さないようにしてください。これは deobfuscation プロセスに影響を与え、正確な結果を得られなくなる可能性があります。

  1. JSNice のより現代的な代替手法については、次のリンクを参照してください:

Wakaru はモダンなフロントエンド向けの Javascript decompiler です。バンドルされたトランスパイルされたソースから元のコードを取り戻します。

このツールは、大規模な言語モデル(ChatGPT や llama2 のような)および他のツールを使用して、Javascript コードを un-minify します。LLM は構造的な変更を行わないことに注意してください - 変数や関数の名前を変更するヒントのみを提供します。コードは 1-1 に等しく保たれるように、AST レベルで Babel によって重要な作業が行われます。

  1. console.log() を使用します;

  • 最後に返される値を見つけて、それを console.log(<packerReturnVariable>); に変更して、deobfuscated js が実行されるのではなく、コンソールにログが出力されるようにします。

  • 次に、修正された(まだ obfuscated されている)js を https://jsconsole.com/ に貼り付けて、コンソールに deobfuscated js がログ出力されるのを確認します。

  • 最後に、deobfuscated 出力を https://prettier.io/playground/ に貼り付けて、解析のために整形します。

  • 注意: まだ packed された(が異なる)js が表示される場合、再帰的に packed されている可能性があります。プロセスを繰り返してください。

参考文献

ツール

あまり使用されていない参考文献

Last updated