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-3471). 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-7022).
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.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-8453).
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-884).
PentestPhase | Dipicu oleh | Lokasi |
|---|---|---|
INITIALIZATION | awal ScannerEngine.scan | core/scanner_engine.py:7025 |
RECONNAISSANCE | run_reconnaissance | core/scanner_engine.py:6756 |
CRAWLING | crawl_recursive | core/scanner_engine.py:3587 |
VULNERABILITY_SCANNING | scan_all_urls | core/scanner_engine.py:6178 |
REPORTING | akhir scan, setelah post-scan | core/scanner_engine.py:9479 |
COMPLETED | setelah notifikasi selesai dikirim | core/scanner_engine.py:96110 |
Nilai EXPLOITATION tetap ada di enum tetapi tidak dipakai oleh alur ini (core/pentest_state_manager.py:24-3211).
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-9912). Empat komponen terakhir pada tabel berikut baru hidup bila config-nya aktif (core/scanner_engine.py:146-20813).
| Config | Komponen | Perilaku saat gagal |
|---|---|---|
plugin_manager.enabled | PluginManager.load_plugins | plugin tidak dimuat |
secrets_scanner.enabled (default True) | SecretsDetector | secrets_scanner bernilai None |
oast.enabled | OASTCallbackServer | oast_server dibatalkan, OAST_CALLBACK_URL tetap dari config |
intercepting_proxy.enabled | ProxyRunner | RuntimeError bila intercepting_proxy.required |
challenge_solver.enabled | ChallengeSolver | challenge dilewati |
login_replay.enabled | LoginPlayer dan _login_macro_path (default config/login_macro.json) | login replay tidak jalan |
captcha.enabled | CaptchaDetector | CAPTCHA tidak dideteksi |
templates.enabled | TemplateExecutor dan load_templates | _loaded_templates kosong |
auth_session.enabled | AuthSessionStore dan apply_role | sesi peran tidak diterapkan |
experimental.enable_cve_matching | get_cve_matcher(auto_seed=True) | cve_matcher bernilai None |
⚠️
intercepting_proxy.requiredmengubah kegagalanmitmwebmenjadiRuntimeErrordi 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-20813).
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-71714).
Recon dan subdomain
Recon bersifat opsional dan mengisi results['reconnaissance']; run_reconnaissance memanggil recon_engine.run lalu mengembalikan hasilnya (core/scanner_engine.py:673-68015). 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-75816). Bila mobile.enabled aktif, engine juga menjalankan lima tester mobile dan menambahkan source='mobile' pada temuannya (core/scanner_engine.py:733-75816).
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-41317). 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-35418).
| Aspek | Nilai dari kode | Lokasi |
|---|---|---|
| Ukuran batch | self.threads URL per putaran | core/scanner_engine.py:382-38419 |
| Jumlah worker | min(self.threads, 10) | core/scanner_engine.py:37920 |
| Batas kedalaman | hanya depth < self.depth yang diproses | core/scanner_engine.py:38721 |
| Timeout per worker | self.timeout * 3 | core/scanner_engine.py:39622 |
| Filter URL | _should_include_url untuk ekstensi, pattern, dan scope | core/scanner_engine.py:336-35023 |
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-81624). ai_planner.enabled meminta AIAttackPlanner.plan dan boleh menimpa self.threads serta memotong jumlah URL ke plan['max_urls'] (core/scanner_engine.py:818-83525). 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-67126).
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.| Urutan | Aksi di scan_url | Rujukan |
|---|---|---|
| 1 | _should_include_url menolak URL di luar scope atau berekstensi terlarang | core/scanner_engine.py:420-42427 |
| 2 | http_client.get; response kosong membuat URL dilewati | core/scanner_engine.py:429-43228 |
| 3 | context diisi forms, cookies, lalu param OpenAPI (json_params, query_params, injectable_headers) | core/scanner_engine.py:434-48029 |
| 4 | challenge_solver.solve mencoba melewati challenge | core/scanner_engine.py:486-49030 |
| 5 | captcha_detector.detect mengembalikan daftar kosong bila halaman terdeteksi terproteksi | core/scanner_engine.py:492-50331 |
| 6 | ai_payload_generator.generate_payloads menyusun payload per konteks | core/scanner_engine.py:50632 |
| 7 | vulnerability_scanner.scan menerima state_manager untuk melacak serangan | core/scanner_engine.py:509-51433 |
| 8 | SmartBrowserTester.test_browser_sync bila rendering JavaScript aktif | core/scanner_engine.py:519-52934 |
| 9 | plugin_manager.scan_with_plugins | core/scanner_engine.py:533-53535 |
| 10 | template_executor.run untuk setiap template YAML terpilih | core/scanner_engine.py:537-54436 |
| 11 | _extra_module_testers dibungkus start_attack dan end_attack | core/scanner_engine.py:546-55737 |
| 12 | secrets_scanner.scan_response mengubah secret menjadi temuan Secret Exposure - <tipe> | core/scanner_engine.py:560-58438 |
| 13 | cve_matcher.enrich_vulnerability | core/scanner_engine.py:589-59539 |
| 14 | state_manager.add_vulnerability dan alert critical lewat notification_manager | core/scanner_engine.py:598-60840 |
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-55741). 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-94142).
| Tahap | Fungsi | Gerbang config | Lokasi |
|---|---|---|---|
| Dedupe | dedupe_findings | reporting.dedupe (default True) | core/scanner_engine.py:851-85843 |
| FP replay | FPReplay.replay | fp_replay.enabled | core/scanner_engine.py:860-86744 |
| Evidence summary | EvidenceSummarizer.enrich | evidence_summary.enabled | core/scanner_engine.py:869-87645 |
| RAG CVE link | CVERagIndex.search mengisi cve_references dan rag_matched | rag.enabled | core/scanner_engine.py:878-91046 |
| Compliance | enrich_vulnerabilities dengan pci_dss, soc2, iso_27001 | compliance.enabled | core/scanner_engine.py:912-92347 |
| AI triage dan bounty | AITriage.triage_vulnerabilities, lalu BountyWriter.generate_reports | ai_triage dan bug_bounty | core/scanner_engine.py:925-94148 |
RAG membangun ulang index bila rag.auto_rebuild aktif dan rag.is_stale(cve_db_path) bernilai benar (core/scanner_engine.py:878-91046). 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-34449). Setelah itu fase berpindah ke REPORTING, ringkasan ditampilkan, dan notification_manager.send_scan_complete dipanggil sebelum fase menjadi COMPLETED (core/scanner_engine.py:943-96150). Server OAST dan proxy kemudian dihentikan, oast_callbacks disalin ke results, dan checkpoint disimpan (core/scanner_engine.py:963-98251).
Checkpoint ditulis ke data/checkpoints/<target>.json berisi urls_discovered, urls_scanned, vulnerabilities, dan stats (core/pentest_state_manager.py:355-37752).
⚠️
load_checkpointsudah tersedia untuk melanjutkan pemindaian, tetapi tidak ada pemanggil di repository ini (core/pentest_state_manager.py:379-38953). 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-36954). Perbandingan dua hasil scan dan mode --diff ada di Scan Diff dan Retest.