Lompat ke konten
dokumentasi.id
Commit e4397d1
v1
Star2,4 rb

2.5

Pemindai Kerentanan dan Katalog Modul

VulnerabilityScanner adalah satu titik masuk untuk semua pemeriksaan kerentanan. Kelas ini didefinisikan di core/vulnerability_scanner.py:31-39. Konstruktornya menerima config lalu http_client (urutan ini terbalik dibanding modul biasa), menyimpan self.scanner_config, dan membaca daftar enabled_checks dari kunci vulnerability_scanner. ScannerEngine membuatnya sekali saat inisialisasi, lalu memberi ai_manager ke tester yang punya metode set_ai_manager. core/scanner_engine.py:65-74

scan() dipanggil sekali per URL oleh engine dengan payloads, context, dan state_manager. core/scanner_engine.py:505-516 Signature-nya mengembalikan List[Dict], satu dict per temuan, dan setiap pemeriksaan hanya berjalan bila namanya ada di enabled_checks. core/vulnerability_scanner.py:109-122

Tiga jalur pemeriksaan

Satu pemanggilan scan() menyalurkan pekerjaan lewat tiga jalur berbeda. Ketiganya menulis ke list vulnerabilities yang sama, jadi format hasil akhirnya seragam.

JalurCara terdaftarCheck keyPemanggilan
Bawaan _check_*metode di kelas VulnerabilityScannersql_injection, xss, ssrf, cors_misconfiguration, security_misconfiguration, dan seterusnyaself._check_*(url, payloads[...], context)
Tester modul intiatribut yang dibuat di __init__nosql_injection, http_smuggling, race_condition, log4shell, oauth_testing, mass_assignment, prototype_pollutiontester.scan(url, context)
_feature_testerstuple _specs + importlibcors_csp, jwt_deep, idor, ssti_engines, frida_mobile, dan seterusnyatester.scan(url, context)

Contoh jalur bawaan: blok sql_injection membungkus pemeriksaan dengan state_manager.start_attack dan state_manager.end_attack. core/vulnerability_scanner.py:125-131 Beberapa jalur bawaan memakai gerbang tambahan, misalnya api_security hanya dijalankan jika _is_api_endpoint(url) bernilai benar. core/vulnerability_scanner.py:216-222 Modul inti mengikuti pola yang sama, misalnya blok nosql_injection yang memanggil self.nosql_tester.scan. core/vulnerability_scanner.py:269-275

Jalur dispatch pemeriksaan

Diagram berikut menunjukkan perpindahan satu URL dari engine sampai menjadi temuan, termasuk dua titik kegagalan yang ditelan oleh logger.

graph TD
    ENG["ScannerEngine.scan_all_urls"] --> SCAN["VulnerabilityScanner.scan"]
    SCAN --> GATE{"check_name in enabled_checks"}
    GATE -->|ya| NATIVE["_check_* bawaan"]
    GATE -->|ya| CORE["tester modul inti"]
    GATE -->|ya| FEAT["loop _feature_testers"]
    FEAT --> SPECS["tuple _specs + importlib"]
    SPECS --> TESTER["tester.scan(url, context)"]
    NATIVE --> OUT["list vulnerabilities"]
    CORE --> OUT
    TESTER --> OUT
    SPECS -->|Exception| SKIP["logger.debug skipped"]
    TESTER -->|Exception| FAIL["logger.error failed"]
    OUT --> STATE["state_manager.end_attack"]
    style SCAN fill:#f59e0b,color:#000
    style GATE fill:#f59e0b,color:#000
    style TESTER fill:#2d7d46,color:#fff
    style OUT fill:#8b5cf6,color:#fff
    style STATE fill:#336791,color:#fff
    style SKIP fill:#dc2626,color:#fff
    style FAIL fill:#dc2626,color:#fff
%% fig: Jalur dispatch pemeriksaan di VulnerabilityScanner
%% desc: Satu URL melewati gerbang enabled_checks, lalu masuk ke pemeriksaan bawaan, modul inti, atau loop _feature_testers; kegagalan import maupun eksekusi hanya dicatat ke logger.
Fig. 1: Jalur dispatch pemeriksaan di VulnerabilityScannerSatu URL melewati gerbang enabled_checks, lalu masuk ke pemeriksaan bawaan, modul inti, atau loop _feature_testers; kegagalan import maupun eksekusi hanya dicatat ke logger.

Katalog _specs

_feature_testers diisi oleh __init__ dari tuple _specs berisi 27 entri (check_name, mod_name, cls_name). core/vulnerability_scanner.py:70-107 Setiap entri diimpor dengan importlib.import_module(mod_name), kelasnya diambil lewat getattr(mod, cls_name), lalu instansnya disimpan sebagai pasangan (check_name, cls(...)). Jika import atau instansiasi gagal, entri itu dilewati dan hanya dicatat di level debug dengan pesan Feature tester {check_name} skipped. core/vulnerability_scanner.py:101-107

Saat scan() berjalan, loop _feature_testers melewati check yang tidak ada di enabled_checks, memanggil tester.scan(url, context), menambahkan hasilnya ke vulnerabilities, dan menutup pembukuan lewat state_manager.end_attack. core/vulnerability_scanner.py:325-338 Kegagalan di dalam tester ditangkap dan dilaporkan sebagai logger.error(f"Feature check {check_name} failed on {url}: {e}") tanpa menghentikan pemeriksaan lain. core/vulnerability_scanner.py:337-338

Dokumentasi internal membagi katalog ini per jalur pemasangan: kelas VulnerabilityScanner untuk set klasik, _feature_testers untuk paket fitur, dan ScannerEngine._init_extra_module_testers untuk paket infrastruktur. docs/MODULES.md:126-133 Pembagian ketiga itu memang terpisah di kode: _init_extra_module_testers memetakan directory_bruteforce, port_scanner, saml_attacks, subdomain_takeover, dan cache_poisoning ke kelasnya masing-masing. core/scanner_engine.py:244-281

Kontrak modul

Setiap paket di bawah modules/ mengikuti satu antarmuka: konstruktor (http_client, config: dict) dan metode scan(url, context=None) yang mengembalikan list dict temuan. docs/MODULES.md:5-19 Dict temuan wajib memuat type, severity, url, parameter, payload, evidence, dan remediation, ditambah field opsional. docs/MODULES.md:17 Aktivasi dilakukan dengan menambahkan nama check ke vulnerability_scanner.enabled_checks, dan tidak semua paket aktif secara default. docs/MODULES.md:19

Untuk menambah modul, urutannya: buat modules/<name>/__init__.py dan berkas tester, implementasikan konstruktor dan scan, lampirkan ke _feature_testers atau _init_extra_module_testers, lalu daftarkan nama check di enabled_checks pada config/config.example.yaml. docs/MODULES.md:137-145 Berkas contoh konfigurasi memuat blok enabled_checks yang panjang, termasuk cors_csp, jwt_deep, graphql_deep, idor, dan paket lain sampai android_static. config/config.example.yaml:196-207

Contoh: jwt_deep

JWTDeepTester menerima (http_client, config) dan membaca daftar weak_secrets dari kunci jwt_deep di config. Metode scan() mengekstrak token lebih dulu, lalu menjalankan _test_alg_none dan _test_header_claims untuk setiap token. modules/jwt_deep/tester.py:27-42 _extract_tokens memeriksa URL, body response, header, dan cookie, lalu memotong hasilnya ke maksimal 5 token. modules/jwt_deep/tester.py:44-59

_test_alg_none menyusun token dengan header {"alg": "none", "typ": "JWT"} dan mengirimnya lewat Authorization, X-Auth-Token, serta Cookie; temuan dibuat bila status 200 atau 201 dan body tidak memuat invalid atau unauthorized. modules/jwt_deep/tester.py:61-97 _test_header_claims menyisipkan kid bernilai ../../../../etc/passwd dan menandai temuan JWT kid Path Traversal bila body memuat root:. modules/jwt_deep/tester.py:99-131 Kedua fungsi mengembalikan dict dengan kunci yang sama seperti kontrak modul, sehingga hasilnya bisa langsung digabung ke vulnerabilities.

⚠️ Kegagalan import pada _specs hanya menghasilkan logger.debug, bukan peringatan. Modul yang hilang dependensinya akan diam-diam tidak pernah berjalan meski namanya ada di enabled_checks. core/vulnerability_scanner.py:101-107

⚠️ Konfigurasi default hanya memuat 10 check (sql_injection sampai security_misconfiguration), sehingga seluruh isi _feature_testers tidak ikut berjalan tanpa penambahan manual. utils/config_loader.py:86-98

Jumlah pemeriksaan

Kelas ini menyediakan 23 metode _check_*, dari _check_sql_injection sampai _check_broken_authentication, masing-masing memakai http_client yang dipegang scanner. core/vulnerability_scanner.py:392-1551 Nama metode tidak selalu sama dengan nama check key; _check_cors dipicu oleh cors_misconfiguration, dan _check_security_headers dipicu oleh security_misconfiguration. core/vulnerability_scanner.py:166-170