hacktricks/network-services-pentesting/pentesting-web/code-review-tools.md
2024-02-10 13:03:23 +00:00

22 KiB

Revisione del codice sorgente / Strumenti SAST

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Guida e elenchi di strumenti

Strumenti multi-linguaggio

Naxus - AI-Gents

C'è un pacchetto gratuito per la revisione delle PR.

Semgrep

È uno strumento Open Source.

Lingue supportate

Categoria Lingue
GA C# · Go · Java · JavaScript · JSX · JSON · PHP · Python · Ruby · Scala · Terraform · TypeScript · TSX
Beta Kotlin · Rust
Sperimentale Bash · C · C++ · Clojure · Dart · Dockerfile · Elixir · HTML · Julia · Jsonnet · Lisp ·

Inizio rapido

{% code overflow="wrap" %}

# 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

{% endcode %}

Puoi anche utilizzare l'estensione semgrep per VSCode per ottenere i risultati all'interno di VSCode.

SonarQube

Esiste una versione gratuita installabile.

Avvio rapido

{% code overflow="wrap" %}

# 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>

{% endcode %}

CodeQL

Esiste una versione gratuita installabile, ma secondo la licenza puoi utilizzare solo la versione gratuita di CodeQL nei progetti Open Source.

Installazione

{% code overflow="wrap" %}

# 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

{% endcode %}

Guida rapida - Preparare il database

{% hint style="success" %} La prima cosa da fare è preparare il database (creare l'albero del codice) in modo che successivamente le query possano essere eseguite su di esso. {% endhint %}

  • Puoi consentire a codeql di identificare automaticamente il linguaggio del repository e creare il database

{% code overflow="wrap" %}

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

{% endcode %}

{% hint style="danger" %} Questo solitamente provoca un errore che indica che è stata specificata più di una lingua (o rilevata automaticamente). Controlla le opzioni successive per risolvere questo problema! {% endhint %}

{% code overflow="wrap" %}

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

{% endcode %}

  • Se il tuo repository utilizza più di un linguaggio, puoi anche creare 1 DB per ogni linguaggio indicando ciascun linguaggio.

{% code overflow="wrap" %}

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/*

{% endcode %}

  • Puoi anche permettere a codeql di identificare tutti i linguaggi per te e creare un database per ogni linguaggio. Devi fornire un GITHUB_TOKEN.

{% code overflow="wrap" %}

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/*

{% endcode %}

Guida rapida - Analizza il codice

{% hint style="success" %} Ora è finalmente il momento di analizzare il codice {% endhint %}

Ricorda che se hai utilizzato diversi linguaggi, verrà creato un DB per ogni linguaggio nel percorso specificato.

{% code overflow="wrap" %}

# 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

{% endcode %}

Avvio rapido - Scriptato

{% code overflow="wrap" %}

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

{% endcode %}

Puoi visualizzare le scoperte su https://microsoft.github.io/sarif-web-component/ o utilizzando l'estensione di VSCode SARIF viewer.

Puoi anche utilizzare l'estensione di VSCode per ottenere le scoperte all'interno di VSCode. Dovrai comunque creare manualmente un database, ma successivamente puoi selezionare qualsiasi file e fare clic su Right Click -> CodeQL: Run Queries in Selected Files

Snyk

C'è una versione gratuita installabile.

Avvio rapido

# 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

Puoi anche utilizzare l'estensione Snyk per VSCode per ottenere risultati all'interno di VSCode.

Insider

È Open Source, ma sembra non mantenuto.

Lingue supportate

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

Inizio rapido

# 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>

DeepSource

Gratuito per i repository pubblici.

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
# Install & run
docker run -it -p 9090:9090 opensecurity/nodejsscan:latest
# Got to localhost:9090
# Upload a zip file with the code
  • RetireJS: L'obiettivo di Retire.js è aiutarti a rilevare l'uso di versioni di librerie JS con vulnerabilità conosciute.
# Install
npm install -g retire
# Run
cd /path/to/repo
retire --colors

Electron

  • electronegativity: È uno strumento per identificare errori di configurazione e anti-pattern di sicurezza nelle applicazioni basate su Electron.

Python

  • Bandit: Bandit è uno strumento progettato per trovare problemi di sicurezza comuni nel codice Python. Per fare ciò, Bandit elabora ogni file, costruisce un AST da esso ed esegue i plugin appropriati sui nodi AST. Una volta che Bandit ha finito di scansionare tutti i file, genera un report.
# Install
pip3 install bandit

# Run
bandit -r <path to folder>
  • safety: Safety controlla le dipendenze Python per vulnerabilità di sicurezza note e suggerisce le opportune soluzioni per le vulnerabilità rilevate. Safety può essere eseguito su macchine degli sviluppatori, nelle pipeline CI/CD e nei sistemi di produzione.
# Install
pip install safety
# Run
safety check
  • Pyt: Non mantenuto.

.NET

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

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

RUST

Rust is a systems programming language that focuses on safety, speed, and concurrency. It is designed to be memory safe and thread safe, making it a good choice for building reliable and efficient software. Rust's syntax is similar to C++, but it includes modern features such as pattern matching, type inference, and ownership semantics.

Code Review Tools

When performing a code review in Rust, there are several tools that can help identify potential vulnerabilities and improve code quality. Here are some commonly used code review tools for Rust:

  • Clippy: Clippy is a linter for Rust that provides helpful suggestions and warnings to improve code quality. It can catch common mistakes, enforce best practices, and identify potential bugs.

  • Rustfmt: Rustfmt is a tool for formatting Rust code according to the official Rust style guidelines. It automatically formats code to improve readability and maintain consistency across projects.

  • Cargo Audit: Cargo Audit is a tool that checks for known vulnerabilities in the dependencies used by a Rust project. It scans the project's Cargo.lock file and compares it against a database of known vulnerabilities.

  • Rust Analyzer: Rust Analyzer is an integrated development environment (IDE) tool that provides code analysis and navigation features for Rust projects. It offers features such as code completion, documentation lookup, and refactoring support.

  • RustSec: RustSec is a security advisory database for Rust crates. It provides information about vulnerabilities and security issues in Rust dependencies, allowing developers to stay informed and take necessary actions.

These tools can be used individually or in combination to perform a comprehensive code review and ensure the security and quality of Rust code. By leveraging these tools, developers can identify and fix potential vulnerabilities early in the development process, reducing the risk of security breaches and improving overall code reliability.

# Install
cargo install cargo-audit

# Run
cargo audit

#Update the Advisory Database
cargo audit fetch

Java

Java è un linguaggio di programmazione ad alto livello, orientato agli oggetti e multi-piattaforma. È ampiamente utilizzato per lo sviluppo di applicazioni web e mobili. Java è noto per la sua portabilità, sicurezza e robustezza.

Strumenti di revisione del codice Java

Esistono diversi strumenti di revisione del codice disponibili per l'analisi statica del codice Java. Questi strumenti aiutano a identificare potenziali vulnerabilità e problemi di sicurezza nel codice sorgente Java.

FindBugs

FindBugs è uno strumento di analisi statica del codice Java che individua potenziali bug e problemi di sicurezza. Utilizza un'ampia gamma di regole predefinite per identificare le vulnerabilità nel codice sorgente Java.

Esempio di utilizzo:

findbugs -textui -effort:max -html -output report.html MyJavaFile.java

PMD

PMD è uno strumento di analisi statica del codice Java che individua potenziali problemi di codifica e stili di programmazione non corretti. Può essere utilizzato per identificare vulnerabilità e migliorare la qualità del codice Java.

Esempio di utilizzo:

pmd -d MyJavaDirectory -f html -R ruleset.xml -r report.html

Checkstyle

Checkstyle è uno strumento di analisi statica del codice Java che applica regole di stile e convenzioni di codifica. Può essere utilizzato per garantire che il codice Java segua le linee guida di codifica stabilite.

Esempio di utilizzo:

checkstyle -c config.xml MyJavaFile.java

SonarQube

SonarQube è una piattaforma di analisi continua della qualità del codice che supporta diversi linguaggi di programmazione, inclusi Java. Fornisce un'ampia gamma di regole predefinite per identificare vulnerabilità, bug e problemi di sicurezza nel codice Java.

Esempio di utilizzo:

sonar-scanner -Dsonar.projectKey=myProject -Dsonar.sources=src -Dsonar.host.url=http://localhost:9000 -Dsonar.login=myToken

Conclusioni

L'utilizzo di strumenti di revisione del codice Java può aiutare a identificare e risolvere potenziali vulnerabilità e problemi di sicurezza nel codice sorgente Java. È consigliabile utilizzare una combinazione di questi strumenti per ottenere una copertura completa dell'analisi statica del codice Java.

# 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
Compito Comando
Esegui Jar java -jar [jar]
Decomprimi Jar unzip -d [directory di output] [jar]
Crea Jar jar -cmf META-INF/MANIFEST.MF [jar di output] *
Base64 SHA256 sha256sum [file] | cut -d' ' -f1 | xxd -r -p | base64
Rimuovi Firma rm META-INF/.SF META-INF/.RSA META-INF/*.DSA
Elimina dal Jar zip -d [jar] [file da rimuovere]
Decompila classe procyon -o . [percorso della classe]
Decompila Jar procyon -jar [jar] -o [directory di output]
Compila classe javac [percorso del file .java]

Vai

https://github.com/securego/gosec

PHP

Psalm e PHPStan.

Plugin Wordpress

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

Solidity

JavaScript

Scoperta

  1. Burp:
  • Spider e scopri il contenuto
  • Sitemap > filtro
  • Sitemap > clic destro sul dominio > Strumenti di coinvolgimento > Trova script
  1. WaybackURLs:
  • waybackurls <dominio> |grep -i "\.js" |sort -u

Analisi statica

Sminifica/Abbellisci

Deobfuscate/Decomprimi

Nota: Potrebbe non essere possibile deobfuscare completamente.

  1. Trova e usa i file .map:
  • Se i file .map sono esposti, possono essere utilizzati per deobfuscare facilmente.
  • Comunemente, foo.js.map mappa a foo.js. Cerca manualmente.
  • Usa JS Miner per cercarli.
  • Assicurati di condurre una scansione attiva.
  • Leggi 'Consigli/Note'
  • Se trovati, usa Maximize per deobfuscare.
  1. Senza file .map, prova JSnice:
  • Riferimenti: http://jsnice.org/ & https://www.npmjs.com/package/jsnice
  • Consigli:
  • Se si utilizza jsnice.org, fare clic sul pulsante delle opzioni accanto al pulsante "Nicify JavaScript" e deselezionare "Infer types" per ridurre l'ingombro del codice con commenti.
  • Assicurarsi di non lasciare righe vuote prima dello script, poiché potrebbe influire sul processo di deobfuscazione e fornire risultati inaccurati.
  1. Usa console.log();
  • Trova il valore di ritorno alla fine e cambialo in console.log(<packerReturnVariable>); in modo che il js deobfuscatato venga stampato invece di essere eseguito.
  • Quindi, incolla il js modificato (ancora obfuscatato) in https://jsconsole.com/ per vedere il js deobfuscatato registrato nella console.
  • Infine, incolla l'output deobfuscatato in https://prettier.io/playground/ per abbellirlo per l'analisi.
  • Nota: Se si sta ancora visualizzando js impacchettato (ma diverso), potrebbe essere impacchettato in modo ricorsivo. Ripetere il processo.

Riferimenti

Strumenti

Riferimenti meno utilizzati

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks: