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

2.3

Alur Scan

ScannerEngine.scan adalah satu-satunya pintu masuk pemindaian. deep_eye.py membangun AIProviderManager dan ScannerEngine, memanggil scan, lalu menyerahkan results ke ReportGenerator (deep_eye.py:342-347). Urutan fase di dalam scan tetap: status diset ke INITIALIZATION, login replay dijalankan bila aktif, recon bila diminta, crawling, pemindaian per URL, lalu rantai post-scan (core/scanner_engine.py:682-702).

Siklus hidup satu pemindaian

sequenceDiagram
    participant CLI as deep_eye.py main
    participant SE as ScannerEngine
    participant SM as PentestStateManager
    participant HC as HTTPClient
    participant VS as VulnerabilityScanner
    CLI->>SE: inisialisasi ScannerEngine
    CLI->>SE: scan enable_recon full_scan quick_scan scan_subdomains
    SE->>SM: set_phase INITIALIZATION
    SE->>SE: login_player.play macro
    opt enable_recon aktif
        SE->>SM: set_phase RECONNAISSANCE
        SE->>SE: run_reconnaissance
    end
    opt scan_subdomains aktif
        SE->>SE: subdomain_scanner.discover_and_scan
    end
    SE->>SM: set_phase CRAWLING
    SE->>HC: crawl_recursive per batch depth
    SE->>SE: openapi expand lalu AIAttackPlanner.plan
    SE->>SM: set_phase VULNERABILITY_SCANNING
    loop setiap URL yang lolos filter
        SE->>VS: scan url payloads context state_manager
        VS-->>SE: scan_results
    end
    SE->>SM: set_phase REPORTING
    SE->>SM: set_phase COMPLETED
    SE->>SM: save_checkpoint
    SE-->>CLI: results
    CLI->>CLI: filter retest-new lalu ReportGenerator
%% fig: Siklus hidup satu pemanggilan scan
%% desc: Menunjukkan urutan pemanggilan dari deep_eye.py masuk ke ScannerEngine, perpindahan fase di PentestStateManager, dan hasil yang kembali ke pemanggil.
Fig. 1: Siklus hidup satu pemanggilan scanMenunjukkan urutan pemanggilan dari deep_eye.py masuk ke ScannerEngine, perpindahan fase di PentestStateManager, dan hasil yang kembali ke pemanggil.

scan menerima empat flag yang mengubah panjang alur: enable_recon, full_scan, quick_scan, dan scan_subdomains; ketiga flag pertama hanya memengaruhi fase yang dilewati, sedangkan quick_scan mempersempit pemindaian ke satu URL target saja (core/scanner_engine.py:840-845).

Fase dan penanda status

PentestStateManager menyimpan current_phase bertipe PentestPhase, dan setiap perpindahan mencatat durasi fase sebelumnya ke phases_completed (core/pentest_state_manager.py:79-88).

PentestPhaseDipicu olehLokasi
INITIALIZATIONawal ScannerEngine.scancore/scanner_engine.py:702
RECONNAISSANCErun_reconnaissancecore/scanner_engine.py:675
CRAWLINGcrawl_recursivecore/scanner_engine.py:358
VULNERABILITY_SCANNINGscan_all_urlscore/scanner_engine.py:617
REPORTINGakhir scan, setelah post-scancore/scanner_engine.py:947
COMPLETEDsetelah notifikasi selesai dikirimcore/scanner_engine.py:961

Nilai EXPLOITATION tetap ada di enum tetapi tidak dipakai oleh alur ini (core/pentest_state_manager.py:24-32).

Inisialisasi

Seluruh komponen opsional dinyalakan di ScannerEngine.__init__, sehingga satu ScannerEngine memegang http_client, vulnerability_scanner, ai_payload_generator, recon_engine, plugin_manager, notification_manager, subdomain_scanner, dan secrets_scanner (core/scanner_engine.py:57-99). Empat komponen terakhir pada tabel berikut baru hidup bila config-nya aktif (core/scanner_engine.py:146-208).

ConfigKomponenPerilaku saat gagal
plugin_manager.enabledPluginManager.load_pluginsplugin tidak dimuat
secrets_scanner.enabled (default True)SecretsDetectorsecrets_scanner bernilai None
oast.enabledOASTCallbackServeroast_server dibatalkan, OAST_CALLBACK_URL tetap dari config
intercepting_proxy.enabledProxyRunnerRuntimeError bila intercepting_proxy.required
challenge_solver.enabledChallengeSolverchallenge dilewati
login_replay.enabledLoginPlayer dan _login_macro_path (default config/login_macro.json)login replay tidak jalan
captcha.enabledCaptchaDetectorCAPTCHA tidak dideteksi
templates.enabledTemplateExecutor dan load_templates_loaded_templates kosong
auth_session.enabledAuthSessionStore dan apply_rolesesi peran tidak diterapkan
experimental.enable_cve_matchingget_cve_matcher(auto_seed=True)cve_matcher bernilai None

⚠️ intercepting_proxy.required mengubah kegagalan mitmweb menjadi RuntimeError di dalam __init__, jadi pemindaian tidak pernah dimulai. Tanpa flag itu, kegagalan hanya dicatat sebagai warning.

PentestStateManager(target_url) juga dibuat di __init__ bersama visited_urls, vulnerabilities, dan lock yang dipakai fase berikutnya (core/scanner_engine.py:146-208).

Login replay sebelum crawl

Login replay adalah langkah pertama di dalam scan, sebelum results dibentuk. load_macro membaca berkas macro, login_player.play menjalankannya, dan bila gagal dengan login_replay.abort_on_fail bernilai True (default) engine melempar RuntimeError; bila False, kegagalan hanya menjadi warning dan pemindaian lanjut (core/scanner_engine.py:704-717).

Recon dan subdomain

Recon bersifat opsional dan mengisi results['reconnaissance']; run_reconnaissance memanggil recon_engine.run lalu mengembalikan hasilnya (core/scanner_engine.py:673-680). Daftar modul recon ada di Pemindai Kerentanan dan Katalog Modul.

Subdomain scanning berjalan setelah recon bila scan_subdomains aktif. Setiap temuan dari subdomain ditandai source='subdomain' dan subdomain=<nama>, lalu di-enrich oleh cve_matcher sebelum masuk ke self.vulnerabilities (core/scanner_engine.py:733-758). Bila mobile.enabled aktif, engine juga menjalankan lima tester mobile dan menambahkan source='mobile' pada temuannya (core/scanner_engine.py:733-758).

Crawling paralel

crawl_recursive memulai dengan all_urls = {target_url} dan queue = [(target_url, 0)], lalu memproses queue dalam batch paralel (core/scanner_engine.py:356-413). Satu worker crawl menambahkan URL ke visited_urls di bawah lock sebelum mengambil halaman, sehingga URL yang sama tidak dikunjungi dua kali (core/scanner_engine.py:320-354).

AspekNilai dari kodeLokasi
Ukuran batchself.threads URL per putarancore/scanner_engine.py:382-384
Jumlah workermin(self.threads, 10)core/scanner_engine.py:379
Batas kedalamanhanya depth < self.depth yang diprosescore/scanner_engine.py:387
Timeout per workerself.timeout * 3core/scanner_engine.py:396
Filter URL_should_include_url untuk ekstensi, pattern, dan scopecore/scanner_engine.py:336-350

Setelah crawl, dua sumber URL bisa menyusul. openapi.enabled dengan openapi.source memuat spec, memperluas endpoint, dan menyimpan parameternya di _openapi_param_map (core/scanner_engine.py:796-816). ai_planner.enabled meminta AIAttackPlanner.plan dan boleh menimpa self.threads serta memotong jumlah URL ke plan['max_urls'] (core/scanner_engine.py:818-835). Detail penyedia model ada di Lapisan AI Provider.

Pemindaian paralel per URL

scan_all_urls menaikkan fase ke VULNERABILITY_SCANNING, mengirim setiap URL ke scan_url lewat ThreadPoolExecutor(max_workers=self.threads), dan memanggil future.result(timeout=scan_timeout) dengan scan_timeout dari scanner.scan_url_timeout (default 60 detik). Timeout per URL hanya melewati URL itu, bukan menghentikan pemindaian (core/scanner_engine.py:615-671).

graph TD
    U["scan_url"] --> F{"_should_include_url"}
    F -- "False" --> SKIP["URL dilewati, tested=1"]
    F -- "True" --> G["http_client.get"]
    G --> CTX["context: forms, cookies, param OpenAPI"]
    CTX --> CS["challenge_solver.solve"]
    CS --> CAP{"captcha_detector.detect"}
    CAP -- "hit" --> SKIP
    CAP -- "miss" --> PG["ai_payload_generator.generate_payloads"]
    PG --> VS["vulnerability_scanner.scan"]
    VS --> BR["SmartBrowserTester.test_browser_sync"]
    BR --> PL["plugin_manager.scan_with_plugins"]
    PL --> TP["template_executor.run"]
    TP --> EX["_extra_module_testers"]
    EX --> SEC["secrets_scanner.scan_response"]
    SEC --> CVE["cve_matcher.enrich_vulnerability"]
    CVE --> SM["state_manager.add_vulnerability"]
    style SKIP fill:#dc2626,color:#fff
    style CTX fill:#8b5cf6,color:#fff
    style PG fill:#8b5cf6,color:#fff
    style CS fill:#f59e0b,color:#000
    style CAP fill:#f59e0b,color:#000
    style BR fill:#f59e0b,color:#000
    style PL fill:#f59e0b,color:#000
    style TP fill:#f59e0b,color:#000
    style SEC fill:#f59e0b,color:#000
    style VS fill:#2d7d46,color:#fff
    style SM fill:#336791,color:#fff
%% fig: Urutan langkah di dalam scan_url
%% desc: Satu URL melewati filter, pengambilan response, penanganan challenge dan CAPTCHA, lalu rentetan pemeriksaan sampai temuan dicatat ke state manager.
Fig. 2: Urutan langkah di dalam scan_urlSatu URL melewati filter, pengambilan response, penanganan challenge dan CAPTCHA, lalu rentetan pemeriksaan sampai temuan dicatat ke state manager.
UrutanAksi di scan_urlRujukan
1_should_include_url menolak URL di luar scope atau berekstensi terlarangcore/scanner_engine.py:420-424
2http_client.get; response kosong membuat URL dilewaticore/scanner_engine.py:429-432
3context diisi forms, cookies, lalu param OpenAPI (json_params, query_params, injectable_headers)core/scanner_engine.py:434-480
4challenge_solver.solve mencoba melewati challengecore/scanner_engine.py:486-490
5captcha_detector.detect mengembalikan daftar kosong bila halaman terdeteksi terproteksicore/scanner_engine.py:492-503
6ai_payload_generator.generate_payloads menyusun payload per kontekscore/scanner_engine.py:506
7vulnerability_scanner.scan menerima state_manager untuk melacak serangancore/scanner_engine.py:509-514
8SmartBrowserTester.test_browser_sync bila rendering JavaScript aktifcore/scanner_engine.py:519-529
9plugin_manager.scan_with_pluginscore/scanner_engine.py:533-535
10template_executor.run untuk setiap template YAML terpilihcore/scanner_engine.py:537-544
11_extra_module_testers dibungkus start_attack dan end_attackcore/scanner_engine.py:546-557
12secrets_scanner.scan_response mengubah secret menjadi temuan Secret Exposure - <tipe>core/scanner_engine.py:560-584
13cve_matcher.enrich_vulnerabilitycore/scanner_engine.py:589-595
14state_manager.add_vulnerability dan alert critical lewat notification_managercore/scanner_engine.py:598-608

Semua kegagalan di langkah 8 sampai 13 ditangkap dan dicatat sebagai error atau debug, sehingga satu modul yang gagal tidak membatalkan URL tersebut (core/scanner_engine.py:518-557). Validasi template dan plugin sendiri dibahas di Template YAML dan Plugin Kustom.

Post-scan

Rantai post-scan berjalan berurutan pada self.vulnerabilities setelah semua URL selesai; setiap tahap dibungkus try agar kegagalan satu tahap tidak menghentikan tahap lain (core/scanner_engine.py:851-941).

TahapFungsiGerbang configLokasi
Dedupededupe_findingsreporting.dedupe (default True)core/scanner_engine.py:851-858
FP replayFPReplay.replayfp_replay.enabledcore/scanner_engine.py:860-867
Evidence summaryEvidenceSummarizer.enrichevidence_summary.enabledcore/scanner_engine.py:869-876
RAG CVE linkCVERagIndex.search mengisi cve_references dan rag_matchedrag.enabledcore/scanner_engine.py:878-910
Complianceenrich_vulnerabilities dengan pci_dss, soc2, iso_27001compliance.enabledcore/scanner_engine.py:912-923
AI triage dan bountyAITriage.triage_vulnerabilities, lalu BountyWriter.generate_reportsai_triage dan bug_bountycore/scanner_engine.py:925-941

RAG membangun ulang index bila rag.auto_rebuild aktif dan rag.is_stale(cve_db_path) bernilai benar (core/scanner_engine.py:878-910). Mekanisme pencariannya ada di CVE Intelligence dan RAG.

Penutupan, notifikasi, dan checkpoint

scan menyalin state ke results['pentest_state'] lewat get_state_dict, yang memuat phase, urls_discovered, urls_tested, vulnerabilities_found, dan phases_completed (core/pentest_state_manager.py:332-344). Setelah itu fase berpindah ke REPORTING, ringkasan ditampilkan, dan notification_manager.send_scan_complete dipanggil sebelum fase menjadi COMPLETED (core/scanner_engine.py:943-961). Server OAST dan proxy kemudian dihentikan, oast_callbacks disalin ke results, dan checkpoint disimpan (core/scanner_engine.py:963-982).

Checkpoint ditulis ke data/checkpoints/<target>.json berisi urls_discovered, urls_scanned, vulnerabilities, dan stats (core/pentest_state_manager.py:355-377).

⚠️ load_checkpoint sudah tersedia untuk melanjutkan pemindaian, tetapi tidak ada pemanggil di repository ini (core/pentest_state_manager.py:379-389). Checkpoint saat ini bersifat catatan hasil, bukan titik resume otomatis.

Pembuatan berkas laporan setelah scan selesai dibahas di Pelaporan dan Ekspor.

Retest setelah scan

Flag --retest-new tidak mengubah alur di dalam scan. Filter dijalankan pada results['vulnerabilities'] setelah pemindaian selesai, dengan _identity_no_sev sebagai kunci identitas, lalu jumlah temuan baru dicetak (deep_eye.py:349-369). Perbandingan dua hasil scan dan mode --diff ada di Scan Diff dan Retest.