Sicherheit: Allowlist anhand des echten Socket-Peers statt X-Forwarded-For
Die Allowlist-Pruefung nutzte extractDebugClientIp, das X-Forwarded-For zuerst auswertet - ein angreiferkontrollierter Header. Damit konnte ein entfernter Client auf einem 0.0.0.0-Bind die Allowlist komplett umgehen (X-Forwarded-For: 127.0.0.1 -> als Loopback gewertet). Die Allowlist bot so keinerlei Schutz; nur das Token blieb. Fix: Enforcement liest jetzt ausschliesslich req.socket.remoteAddress (getPeerIp), das vom Kernel aus der TCP-Verbindung gesetzt wird und nicht per Header faelschbar ist. X-Forwarded-For wird nur noch fuer das Trace-Log (Beobachtbarkeit) verwendet, nie fuer die Zugriffsentscheidung. Reine, exportierte Matcher-Funktion evaluateClientAllowed. Tests umgebaut auf den Threat-Model statt den faelschbaren Kanal: Unit-Tests fuer Loopback/exakt/CIDR/fail-closed + expliziter Forged-XFF-Test (socket.remoteAddress 8.8.8.8 + X-Forwarded-For 127.0.0.1 -> verweigert). Integration: Loopback verbindet, gespooftes X-Forwarded-For wird ignoriert, Auth bleibt erzwungen, Live-Reload.
This commit is contained in:
@@ -202,7 +202,6 @@ async function createFixture() {
|
||||
fs.writeFileSync(path.join(baseDir, "debug_token.txt"), token, "utf8");
|
||||
fs.writeFileSync(path.join(baseDir, "debug_port.txt"), String(port), "utf8");
|
||||
fs.writeFileSync(path.join(baseDir, "debug_host.txt"), "0.0.0.0", "utf8");
|
||||
fs.writeFileSync(path.join(baseDir, "debug_allowlist.txt"), "159.195.63.46\n", "utf8");
|
||||
const debridLinkApiKeys = "key-a\nkey-b";
|
||||
const debridLinkKeyIds = getDebridLinkApiKeyIds(debridLinkApiKeys);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user