mirror of
https://github.com/shuaiplus/nodewarden.git
synced 2026-08-05 23:00:10 +00:00
fix: block IPv6 loopback in backup destination URL checks
Expand compressed IPv6 hostnames before the private-address allowlist so forms like ::1 cannot bypass SSRF protection for WebDAV/S3 backup endpoints. Also reject IPv4-mapped addresses written as ::ffff:hex:hex.
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
import { normalizeBackupEndpointUrl } from '../src/services/backup-config.ts';
|
||||
import fs from 'node:fs';
|
||||
|
||||
const scratch = process.env.SCRATCH || '.';
|
||||
const cases = [
|
||||
'http://127.0.0.1',
|
||||
'http://169.254.169.254',
|
||||
'http://[::1]',
|
||||
'http://[0:0:0:0:0:0:0:1]',
|
||||
'http://[::2]',
|
||||
'http://[::]',
|
||||
'http://[fe80::1]',
|
||||
'http://[fc00::1]',
|
||||
'https://example.com',
|
||||
];
|
||||
|
||||
const out = [];
|
||||
for (const url of cases) {
|
||||
try {
|
||||
const normalized = normalizeBackupEndpointUrl(url, 'WebDAV server URL');
|
||||
out.push({ url, allowed: true, normalized });
|
||||
} catch (e) {
|
||||
out.push({ url, allowed: false, error: e instanceof Error ? e.message : String(e) });
|
||||
}
|
||||
}
|
||||
|
||||
const path = `${scratch}/poc-normalizeBackupEndpointUrl.json`;
|
||||
fs.writeFileSync(path, JSON.stringify(out, null, 2));
|
||||
console.log(JSON.stringify(out, null, 2));
|
||||
|
||||
// Security expectation: IPv6 loopback must NOT be allowed.
|
||||
const loopback = out.find((row) => row.url === 'http://[::1]');
|
||||
if (loopback?.allowed) {
|
||||
console.error('FINDING_CONFIRMED: normalizeBackupEndpointUrl accepts http://[::1]');
|
||||
process.exitCode = 2;
|
||||
} else {
|
||||
console.log('IPv6 loopback rejected as expected');
|
||||
}
|
||||
Reference in New Issue
Block a user