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

Kamu membaca versi lama. Halaman ini hanya bisa dibaca.

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