Skip to main content

owasp-audit-agent

PyPI version Python versions CI License: MIT

Framework agentic AI untuk audit keamanan kode Python berbasis OWASP Top 10. Ia menganalisis kode sumber lewat Abstract Syntax Tree (AST), mendeteksi kerentanan di 10 kategori OWASP, menghasilkan ringkasan eksekutif dari LLM, mencoba memperbaiki secara otomatis, lalu memverifikasi ulang hasilnya — seluruh alur diorkestrasi dengan LangGraph.

Deteksi memakai checker modular yang ditemukan secara otomatis, sehingga menambah aturan baru atau memasang plugin pihak ketiga tidak perlu menyentuh kode inti.


Fitur utama

  • Deteksi OWASP Top 10 berbasis AST — 10 checker (satu per kategori) yang membaca struktur kode sungguhan, bukan sekadar mencocokkan teks; jauh lebih akurat dan minim false-positive. Otomatis fallback ke regex bila kode gagal di-parse (mode hybrid).
  • Alur agentic (LangGraph) — jalankan checker → eskalasi otomatis → ringkasan LLM → auto-fix → verifikasi ulang berulang.
  • Extensible — auto-discovery checker dari agent/tools/ + dukungan plugin eksternal via entry points.
  • Konfigurasi penuh — file audit.toml atau environment variable: pilih checker, ambang eskalasi, iterasi fix, model & provider LLM.
  • LLM multi-provider — Groq, OpenAI, Anthropic, Google, Ollama (lokal); lazy-init; bisa tambah provider kustom.
  • Pelaporan & integrasi — ekspor SARIF (GitHub Security / VS Code), laporan PDF, riwayat scan, dan dependency scanner (cek requirements.txt terhadap CVE yang dikenal).
  • Tiga antarmuka — CLI, library Python, dan UI Streamlit.

Instalasi

Dari PyPI:

pip install owasp-audit-agent
pip install "owasp-audit-agent[ui]"        # + UI Streamlit

Dari sumber (untuk pengembangan):

git clone https://github.com/Rio-Bewbew/owasp-security-audit-agent.git
cd owasp-security-audit-agent
pip install -e ".[dev]"                    # + pytest, ruff, build

Provider LLM alternatif (opsional): pip install "owasp-audit-agent[openai]" (atau [anthropic], [google], [ollama]).

Siapkan kredensial LLM dalam file .env di root project:

GROQ_API_KEY=your_key_here

Pemakaian

CLI

owasp-audit app.py               # audit satu file
owasp-audit app.py --json        # keluaran JSON (cocok untuk CI)
owasp-audit --list-checkers      # tampilkan checker yang terdaftar

Contoh keluaran:

Ditemukan 3 isu pada app.py:

  [Critical] A04:2025 - Cryptographic Failures (baris 5)
      Kredensial Hardcoded: api_key
  [High] A05:2025 - Injection (baris 12)
      Command Injection via os.system()
  [Medium] A06:2025 - Insecure Design (baris 8)
      Query SELECT * Tanpa LIMIT

Sebagai library

from agent import audit_code

result = audit_code(open("app.py").read(), "app.py")

for f in result["findings"]:
    print(f.severity.value, f.owasp_category.value, f.title, f.line_number)

print(result["summary"])          # ringkasan eksekutif dari LLM

UI (Streamlit)

streamlit run app.py

Buka http://localhost:8501, lalu paste kode atau upload file untuk melihat temuan, tingkat keparahan, dan ringkasannya secara visual.


Cara kerja

Audit dijalankan sebagai graph LangGraph:

START
  -> run_checkers
       -> (Critical > ambang?) -> escalate_alert -> llm_analysis
       -> (tidak)                                -> llm_analysis
  -> auto_fix
  -> verify_fixes
       -> (masih berisiko & < batas iterasi?) -> kembali ke auto_fix
       -> (selesai)                           -> END
  1. run_checkers — semua checker aktif dijalankan atas kode.
  2. escalate_alert — dipicu jika jumlah temuan Critical melebihi ambang.
  3. llm_analysis — LLM menyusun ringkasan eksekutif & prioritas.
  4. auto_fix — perbaikan berbasis aturan (deterministik).
  5. verify_fixes — kode hasil perbaikan di-scan ulang; jika masih berisiko dan belum melewati batas iterasi, kembali ke auto_fix.

Kategori OWASP yang dicakup

Seluruh checker berbasis AST (dengan fallback regex).

Kode Kategori Contoh yang dideteksi
A01 Broken Access Control path traversal, IDOR, fungsi sensitif tanpa auth
A02 Security Misconfiguration DEBUG=True, ALLOWED_HOSTS=['*'], HTTP, SECRET_KEY lemah
A03 Software Supply Chain Failures pickle.loads, yaml.load, import dinamis
A04 Cryptographic Failures hash lemah (MD5/SHA1), kredensial hardcoded
A05 Injection os.system, eval/exec, SQL dari f-string/konkatenasi
A06 Insecure Design random untuk keamanan, SELECT * tanpa LIMIT, input rahasia
A07 Authentication Failures perbandingan password plaintext, verify=False
A08 Software/Data Integrity Failures eval/exec data eksternal, subprocess & open dinamis
A09 Security Logging Failures password/token di log, error via print, except senyap
A10 Mishandling of Exceptional Conditions except: pass, return di finally, div-by-zero

Kenapa AST, bukan regex?

Analisis AST membaca struktur kode (pemanggilan fungsi, assignment, perbandingan), sehingga pola seperti os.system(...) atau except: pass yang muncul di komentar atau string tidak lagi keliru ditandai. Base ASTChecker otomatis jatuh ke regex saat kode tidak bisa di-parse, jadi snippet parsial tetap tertangani.


Konfigurasi

Perilaku audit diatur lewat audit.toml (opsional) dan/atau environment variable. Salin audit.example.toml menjadi audit.toml lalu sesuaikan:

[llm]
provider = "groq"                 # groq | openai | anthropic | google | ollama
model = "llama-3.1-8b-instant"
temperature = 0.0
# base_url = "http://localhost:11434"   # untuk Ollama / endpoint OpenAI-compatible

[audit]
escalation_threshold = 3          # eskalasi jika jumlah CRITICAL > nilai ini
max_fix_iterations = 2
auto_fix = true

[checkers]
enabled = []                      # kosong = semua; mis. ["A01","A05","A07"]
disabled = ["A09"]                # kode kategori yang dimatikan

Environment variable menimpa file (berguna untuk CI): OWASP_LLM_PROVIDER, OWASP_LLM_MODEL, OWASP_LLM_BASE_URL, OWASP_ESCALATION_THRESHOLD, OWASP_MAX_FIX_ITERATIONS, OWASP_AUTO_FIX, OWASP_ENABLED_CHECKERS, OWASP_DISABLED_CHECKERS, OWASP_CONFIG (path file config).

from agent import AuditConfig
cfg = AuditConfig.load()          # audit.toml + env
print(cfg.escalation_threshold, cfg.llm_model, cfg.is_checker_enabled("A05"))

Provider LLM

Provider dipilih lewat [llm] provider. Paket integrasi di-import lazy, jadi cukup pasang yang dipakai. API key dibaca dari env sesuai provider (GROQ_API_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY, dst).

Menambah provider kustom:

from agent import register_provider

@register_provider("myllm")
def _build(config):
    from my_pkg import MyChat
    return MyChat(model=config.llm_model, temperature=config.llm_temperature)

Lalu set provider = "myllm" di config.


Dependency scanner

Selain menganalisis kode, framework bisa memeriksa dependensi di requirements.txt terhadap kerentanan yang diketahui. Secara default ia mengecek tiap paket+versi ke database OSV.dev (mencakup ribuan advisory PyPI dan selalu terbaru); bila jaringan tidak tersedia, ia otomatis memakai daftar bawaan sebagai fallback.

owasp-audit --deps requirements.txt            # via OSV.dev
owasp-audit --deps requirements.txt --offline  # hanya daftar bawaan
owasp-audit --deps requirements.txt --json
from agent.dependency_scanner import scan_requirements

for d in scan_requirements(open("requirements.txt").read()):
    print(d.severity, d.package, d.installed_version, "->", d.safe_version, d.cve)

Menulis checker baru

Cara termudah, subclass ASTChecker dan override check_ast() (opsional check_regex() sebagai fallback):

# agent/tools/my_checker.py
import ast
from typing import List
from agent.ast_utils import ASTChecker, call_name
from agent.models import Finding, OWASPCategory, SeverityLevel

class MyChecker(ASTChecker):
    @property
    def category(self) -> OWASPCategory:
        return OWASPCategory.A05

    @property
    def name(self) -> str:
        return "My Custom Checker"

    def check_ast(self, tree, code, filename) -> List[Finding]:
        findings = []
        for node in ast.walk(tree):
            if isinstance(node, ast.Call) and call_name(node) == "os.system":
                findings.append(Finding(
                    owasp_category=self.category,
                    severity=SeverityLevel.HIGH,
                    title="Contoh temuan",
                    description="Penjelasan singkat.",
                    line_number=node.lineno,
                    recommendation="Cara memperbaiki.",
                ))
        return findings

Letakkan file di agent/tools/ — auto-discovery mendaftarkannya otomatis, tanpa mengubah graph.py atau registry.py.

Plugin eksternal (paket terpisah)

Checker bisa didistribusikan sebagai paket pihak ketiga lewat entry point pada group owasp_audit_agent.checkers:

# pyproject.toml paket plugin kamu
[project.entry-points."owasp_audit_agent.checkers"]
my_checker = "my_package.my_module:MyChecker"

Setelah terpasang, registry.discover_entry_points() memuatnya otomatis.


Arsitektur

agent/
├── base_checker.py       # abstract BaseChecker (kontrak checker)
├── ast_utils.py          # ASTChecker base + helper AST (call_name, dll)
├── registry.py           # CheckerRegistry + auto-discovery + entry points
├── config.py             # AuditConfig (audit.toml + env)
├── llm.py                # factory LLM multi-provider + register_provider
├── models.py             # Finding, OWASPCategory, SeverityLevel (Pydantic)
├── state.py              # AuditState (state LangGraph)
├── graph.py              # workflow LangGraph + audit_code()
├── rule_fixer.py         # perbaikan berbasis aturan
├── sarif_exporter.py     # ekspor hasil ke SARIF
├── dependency_scanner.py # cek requirements.txt terhadap CVE
├── history.py            # riwayat scan
├── report.py             # laporan PDF
├── cli.py                # command owasp-audit
└── tools/                # satu file per checker (auto-discovered)

Pengembangan

pip install -e ".[dev]"
pytest                 # 56 test
ruff check agent tests # lint

CI (GitHub Actions) menjalankan lint + test pada Python 3.10–3.13 di tiap push/PR. Lihat CONTRIBUTING.md untuk panduan kontribusi dan CHANGELOG.md untuk riwayat versi.


Lisensi

MIT — lihat LICENSE.

Metadata

Release files for owasp-audit-agent 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for owasp-audit-agent 0.4.0
File Size Uploaded
owasp_audit_agent-0.4.0.tar.gz 44.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for owasp-audit-agent 0.4.0
File Interpreter ABI Platform
owasp_audit_agent-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 91.7 kB

Release files / owasp_audit_agent-0.4.0.tar.gz

Download URL owasp_audit_agent-0.4.0.tar.gz
Size 44.8 kB
Tags Source
SHA-256 checksum
How to use checksums
70db81335964f224e7759a2a5655da712cbd18deec4c7b06a7521305a5e788fa
BLAKE2b-256 checksum
How to use checksums
1ee07803f7d0fd24675e29e098de573a24552020bb583d8bd72a485f2320e0ef
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 15, 2026.

Transparency log

Release files / owasp_audit_agent-0.4.0-py3-none-any.whl

Download URL owasp_audit_agent-0.4.0-py3-none-any.whl
Size 46.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8840e88d1ab224e71075c07a3dc54f4775e4ef931543a8125f86cf254778b435
BLAKE2b-256 checksum
How to use checksums
2b4348ce35bdd423e7ef8608dee343d6bebdabeef32edfe4ee89cc67efcabba1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 15, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.4.0 This release

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page