it("rejects hosts not in the allowlist", async () => {
await expect(
validateConsentUploadUrl("https://evil.example.com/exfil", { resolveFn: publicResolve }),
).rejects.toThrow("not in the allowed domains");
});
it("rejects an SSRF attempt with internal metadata URL", async () => {
await expect(
validateConsentUploadUrl("https://169.254.169.254/latest/meta-data/", {
resolveFn: publicResolve,
}),
).rejects.toThrow("not in the allowed domains");
});
it("rejects localhost", async () => {
await expect(
validateConsentUploadUrl("https://localhost:8080/internal", { resolveFn: publicResolve }),
).rejects.toThrow("not in the allowed domains");
});
it("rejects when DNS resolves to a private IPv4 (10.x)", async () => {
await expect(
validateConsentUploadUrl("https://malicious.sharepoint.com/exfil", {
resolveFn: privateResolve("10.0.0.1"),
}),
).rejects.toThrow("private/reserved IP");
});
it("rejects when DNS resolves to loopback", async () => {
await expect(
validateConsentUploadUrl("https://evil.sharepoint.com/path", {
resolveFn: privateResolve("127.0.0.1"),
}),
).rejects.toThrow("private/reserved IP");
});
it("rejects when DNS resolves to link-local (169.254.x.x)", async () => {
await expect(
validateConsentUploadUrl("https://evil.sharepoint.com/path", {
resolveFn: privateResolve("169.254.169.254"),
}),
).rejects.toThrow("private/reserved IP");
});
it("rejects when DNS resolves to IPv6 loopback", async () => {
await expect(
validateConsentUploadUrl("https://evil.sharepoint.com/path", {
resolveFn: privateResolve("::1"),
}),
).rejects.toThrow("private/reserved IP");
});
it("rejects when DNS resolves to IPv4-mapped IPv6 private address", async () => {
await expect(
validateConsentUploadUrl("https://evil.sharepoint.com/path", {
resolveFn: privateResolve("::ffff:10.0.0.1"),
}),
).rejects.toThrow("private/reserved IP");
});
it("rejects when DNS resolves to IPv4-mapped IPv6 loopback", async () => {
await expect(
validateConsentUploadUrl("https://evil.sharepoint.com/path", {
resolveFn: privateResolve("::ffff:127.0.0.1"),
}),
).rejects.toThrow("private/reserved IP");
});
it("rejects when any DNS answer is private/reserved", async () => {
await expect(
validateConsentUploadUrl("https://evil.sharepoint.com/path", {
resolveFn: multiResolve(["13.107.136.10", "10.0.0.1"]),
}),
).rejects.toThrow("private/reserved IP");
});
it("accepts when all DNS answers are public", async () => {
await expect(
validateConsentUploadUrl("https://evil.sharepoint.com/path", {
resolveFn: multiResolve(["13.107.136.10", "52.96.0.1"]),
}),
).resolves.toBeUndefined();
});
it("rejects when DNS resolution fails", async () => {
await expect(
validateConsentUploadUrl("https://nonexistent.sharepoint.com/path", {
resolveFn: failingResolve,
}),
).rejects.toThrow("Failed to resolve");
});
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.