From 527711d27c91968e2a720ace35d87632242745f1 Mon Sep 17 00:00:00 2001
From: Alix-007
Date: Thu, 16 Jul 2026 13:32:29 +0800
Subject: [PATCH] fix(crabbox): bound IMDS identity checks (#108165)
---
scripts/crabbox-untrusted-bootstrap.sh | 4 ++--
.../crabbox-untrusted-bootstrap.test.ts | 18 ++++++++++++++++++
2 files changed, 20 insertions(+), 2 deletions(-)
create mode 100644 test/scripts/crabbox-untrusted-bootstrap.test.ts
diff --git a/scripts/crabbox-untrusted-bootstrap.sh b/scripts/crabbox-untrusted-bootstrap.sh
index c2baf4676030..6736ce2eb19d 100755
--- a/scripts/crabbox-untrusted-bootstrap.sh
+++ b/scripts/crabbox-untrusted-bootstrap.sh
@@ -13,12 +13,12 @@ shift
unset NODE_OPTIONS
imds_token="$(
- /usr/bin/curl -fsS -X PUT \
+ /usr/bin/curl -fsS --connect-timeout 2 --max-time 5 -X PUT \
-H "X-aws-ec2-metadata-token-ttl-seconds: 60" \
http://169.254.169.254/latest/api/token
)"
iam_status="$(
- /usr/bin/curl -sS -o /dev/null -w "%{http_code}" \
+ /usr/bin/curl -sS --connect-timeout 2 --max-time 5 -o /dev/null -w "%{http_code}" \
-H "X-aws-ec2-metadata-token: ${imds_token}" \
http://169.254.169.254/latest/meta-data/iam/security-credentials/
)"
diff --git a/test/scripts/crabbox-untrusted-bootstrap.test.ts b/test/scripts/crabbox-untrusted-bootstrap.test.ts
new file mode 100644
index 000000000000..49e582a4f6e9
--- /dev/null
+++ b/test/scripts/crabbox-untrusted-bootstrap.test.ts
@@ -0,0 +1,18 @@
+// Crabbox untrusted bootstrap tests cover the pre-execution identity boundary.
+import { readFileSync } from "node:fs";
+import { describe, expect, it } from "vitest";
+
+describe("scripts/crabbox-untrusted-bootstrap.sh", () => {
+ it("bounds both IMDSv2 identity requests", () => {
+ const script = readFileSync("scripts/crabbox-untrusted-bootstrap.sh", "utf8");
+ const imdsRequests = script.match(
+ /\/usr\/bin\/curl[\s\S]*?http:\/\/169\.254\.169\.254[^\n]*/gu,
+ );
+
+ expect(imdsRequests).toHaveLength(2);
+ for (const request of imdsRequests ?? []) {
+ expect(request).toContain("--connect-timeout 2");
+ expect(request).toContain("--max-time 5");
+ }
+ });
+});