years leading DevSecOps and cybersecurity at PayPal, IKEA, Tekion, and BreachLock. Container Security Supply Chain Security SAST SCA CI/CD Security #ACSC2026 WWW.BSIDESBANGALORE.IN
surfaces in our Node.js app 02 Unravelling the puzzle Go binaries in a pure JavaScript codebase 03 AI as a catalyst Claude navigates 1,247 packages in minutes 04 The key insight The root cause that stumped traditional tools 05 Multi-stage Docker builds Isolating build tools from the production image 06 Dramatic results 2–3 weeks of work compressed into 3 hours 07 Trust but verify Human validation of every AI finding 08 Your AI workflow A 4-step framework for AI-assisted security #ACSC2026 WWW.BSIDESBANGALORE.IN
26,172 lines of package-lock.json Google each of 1,247 packages Read documentation, one repo at a time Build the dependency tree by hand 2–3 weeks THE AI-ASSISTED WAY Upload package.json + package-lock.json Ask specific, targeted questions Get full dependency traces instantly 3 hours — 30× faster #ACSC2026 WWW.BSIDESBANGALORE.IN
CLAUDE “I’ve uploaded our package.json and package-lock.json. Security scan shows Golang vulnerabilities but we only use JavaScript. Can you trace where these Go binaries are coming from ?” Then I waited — hoping for answers that would normally take weeks to uncover. #ACSC2026 WWW.BSIDESBANGALORE.IN
Trace — your application ↓ @xyz/xy-react internal component library ↓ @vanilla-extract/next-plugin CSS-in-JS ↓ @vanilla-extract/integration ↓ [email protected] Go-based JS bundler ↓ 24 platform-specific Go binaries ↓ @esbuild/linux-x64 ← the vulnerability CLAUDE’S EXPLANATION esbuild is a Go-based JavaScript bundler used by vanilla-extract for CSS processing at build time. 5 minutes to a full root-cause trace — the breakthrough moment #ACSC2026 WWW.BSIDESBANGALORE.IN
this actually used in our code?” CLAUDE’S ANSWER “I searched your codebase… no direct usage in your application code.” Only @xyz/xy-react uses vanilla-extract internally. esbuild runs only during npm run build × Not during production runtime × Not in your HTTP request path × Not serving user traffic Like a hammer in your closet: present, but harmless unless used. #ACSC2026 WWW.BSIDESBANGALORE.IN
tools and production code shipped together in one image. image: 1.28 GB esbuild: present alerts: 12 HIGH AFTER — MULTI-STAGE Build stage uses esbuild; production stage ships only compiled output. image: 524 MB (↓59%) esbuild: absent alerts: 3 (↓75%) #ACSC2026 WWW.BSIDESBANGALORE.IN
commands ourselves npm ls esbuild · find node_modules -name esbuild Confirmed AI’s findings exactly Checked the line numbers L10525: @vanilla-extract/integration → esbuild L14318: esbuild with 24 Go binaries All accurate Tested the solution removed @vanilla-extract/next-plugin Build still works — unused dependency Verified in Docker built the multi-stage container No esbuild in the production image AI accelerates. Humans validate. #ACSC2026 WWW.BSIDESBANGALORE.IN
Gather context Upload package.json and the lockfile Share scan results and error messages Provide relevant logs 02 Ask specific questions “Trace where [package] comes from” “Is [dependency] used in my code?” Avoid: “fix my security” — too vague 03 Verify everything Run the suggested commands Check line numbers, test solutions Cross-reference documentation 04 Document & share Save the AI conversations Share findings with your team Build institutional knowledge #ACSC2026 WWW.BSIDESBANGALORE.IN
npm resolves the right platform package at install. No scripts, no external downloads. esbuild, SWC, lightningcss, sharp. 2 postinstall script install-time code execution Runs on npm install, fetches a binary from GitHub Releases. @sentry/cli, hookdeck-cli, older sharp. 3 node-gyp addon build-time code execution from source C/C++ compiled during installation; needs Python + gcc/MSVC. better-sqlite3, bcrypt, canvas. WHAT THE SCANNER SEES All three land binary files in node_modules Scanner reads the embedded runtime version string Flags CVEs against the Go / Rust / libvips version Alert fires in a JS app with no JS vulnerability #ACSC2026 WWW.BSIDESBANGALORE.IN
esbuild case Build-time tool, never runs in production. The CVE targets the Go runtime, not your app. Multi-stage Docker removes it entirely. REAL BUT MANAGEABLE postinstall download Upstream release could be compromised. Pin exact versions, verify SHA256 checksums, use pnpm onlyBuiltDependencies or npm v12 allowlists. ACTIVE THREAT supply chain attack Same postinstall pattern, malicious intent: 33 packages ran credential recon at install (May 2026); the Shai-Hulud worm self-propagated across 500+ packages. The scanner fires the same alert for all three. Context + dependency tracing = correct severity. #ACSC2026 WWW.BSIDESBANGALORE.IN
scripts blocked by default No automatic Git / remote URL resolution Explicit opt-in for all lifecycle scripts pnpm v10+ Lifecycle scripts disabled by default onlyBuiltDependencies: [esbuild, sharp] allowBuilds: per-package granular control TOOLING ITSELF Know your binary. Know your risk level. Multi-stage Docker removes it either way. #ACSC2026 WWW.BSIDESBANGALORE.IN esbuild strips Go version metadata to prevent false-positive CVEs Turbopack: falls back to WASM when no native binding Multi-stage Docker is standard practice
tools are written in Go and Rust for speed. 30–40% of JS apps ship native binaries. Not a bug — the modern ecosystem. 2 AI makes analysis dramatically faster What took weeks now takes hours, and deeper investigations become possible. Always verify the results yourself. 3 Context changes everything Build-time is not runtime risk. Multi-stage builds solve most of these — and ask whether you need the dependency at all. #ACSC2026 WWW.BSIDESBANGALORE.IN
great for file analysis and dependency tracing ChatGPT Free tier available GitHub Copilot Great for code-focused security work #ACSC2026 WWW.BSIDESBANGALORE.IN