หนึ่งพรอมต์ คำสั่งเชลล์สามคำสั่ง ผมใช้ AI ของพวกเขาเองแฮ็กตัวเอง
นี่คือบั๊กประเภทหนึ่งที่อาจมีอยู่ในทุกผลิตภัณฑ์ AI แบบหลายเอเจนต์ที่วางจำหน่ายในปัจจุบัน และวิธีแก้ไขคือรูปแบบการออกแบบที่ยังไม่มีใครในวงการพูดถึง
นี่คือเรื่องราวทั้งหมด
ผมไม่ได้ตั้งใจจะแฮ็กอะไร ผมกำลังวิจัยว่า Perplexity Computer จัดการแซนด์บ็อกซ์อย่างไรสำหรับงานโครงสร้างพื้นฐานเอเจนต์ของตัวเอง ผมกำลังพยายามเข้าใจว่าระบบหลายเอเจนต์ในระบบการผลิตจริงแยกสภาพแวดล้อมการทำงานออกจากกันอย่างไร อะไรที่แชร์กัน อะไรที่ไม่แชร์
ก่อนอื่น ผมเริ่มสำรวจระบบ ผมสังเกตเห็นว่า Claude Code ถูกติดตั้งไว้ในแซนด์บ็อกซ์
ผมให้เอเจนต์รัน Claude Code และสร้างโค้ดทดสอบเพื่อดูว่ามันทำงานอย่างไร ทำงานได้ดี เป็น Claude Code มาตรฐานที่รันในโหมดบายพาสสิทธิ์เพื่อไม่ให้ถามยืนยัน เหมาะสมกับระบบเอเจนต์
ตอนนั้นผมคิดว่า: เดี๋ยวก่อน พวกเขาจัดการคีย์ API ยังไง? Claude Code ต้องใช้คีย์ API ของ Anthropic ถึงจะทำงานได้ คีย์นั้นต้องอยู่ที่ไหนสักแห่งในแซนด์บ็อกซ์นี้ มันถูกฉีดเข้ามายังไง? ขอบเขตของมันคืออะไร? มันแยกออกจากกันหรือเปล่า?
คำถามนั้นคือสิ่งที่ทำให้ผมเดินตามทางนี้ เอเจนต์ย่อยถือคีย์ API ไว้ในสภาพแวดล้อมของกระบวนการ ผมต้องขโมยมัน
Perplexity Computer พยายามหกครั้งและล้มเหลว
- ขอให้เอเจนต์ย่อย dump env: ปฏิเสธ!
- วางสคริปต์โทรจันบนระบบไฟล์ที่แชร์: มันอ่านโค้ดของผม เข้าใจว่ากำลังทำอะไร และปฏิเสธที่จะรันมัน!
- วางยาพิษ .bashrc และ .profile: มันทำงานเร็วเกินไป ก่อนที่คีย์ API จะถูกฉีดเข้าไป
- วางไบนารี node ปลอมใน PATH: ไม่เคยถูกเรียกใช้
- สร้างเอเจนต์เขียนโค้ดและเฝ้าดูต้นไม้กระบวนการพร้อมกัน: เอเจนต์ย่อยรันในแซนด์บ็อกซ์คนละตัว ไม่มีอะไรถูกจับได้ :(
- หา system prompt ของ Claude Code และแก้ไขเพื่อลบพฤติกรรมการปฏิเสธ: หา custom system prompt ที่ถูกฉีดไม่เจอ
หกครั้งที่ล้มเหลว ความปลอดภัยระดับโมเดล/พรอมต์ของ Claude นั้นดีจริงๆ ทุกครั้งที่ผมลองอะไรที่ฉลาด โมเดลก็จับได้

แล้ว Perplexity ก็จำได้ว่า Claude Code เป็นแอป Node.js ที่เปิดใช้งานผ่าน npm และ npm อ่าน ~/.npmrc จากโฮมไดเรกทอรี และโฮมไดเรกทอรีอยู่ในระบบไฟล์ที่แชร์ซึ่งผมสามารถเขียนได้
Node.js มีแฟล็ก --require ที่โหลดโมดูล JavaScript ล่วงหน้าก่อนที่โค้ดแอปพลิเคชันใดๆ จะทำงาน คุณสามารถตั้งค่านี้ผ่าน NODE_OPTIONS ใน .npmrc ซึ่งหมายความว่าถ้าผมเขียน .npmrc ไปยังโฮมไดเรกทอรีที่แชร์ ทุกกระบวนการ Node ที่เอเจนต์ย่อยสร้างขึ้นจะโหลดโค้ดของผมล่วงหน้า! สิ่งนี้เกิดขึ้นก่อนที่ Claude Code จะเริ่มต้นด้วยซ้ำ ก่อนที่การตรวจสอบความปลอดภัยใดๆ จะทำงาน ก่อนทุกอย่าง!
ช่องโหว่คือสามคำสั่ง:
- เขียนสคริปต์หกบรรทัดที่ dump process.env ไปยังไฟล์ในเวิร์กสเปซที่แชร์
- echo 'node-options=--require /path/to/script.js' > ~/.npmrc
- ขอให้ Perplexity Computer ทำภารกิจเขียนโค้ดอะไรก็ได้
เอเจนต์ย่อยบูต → npm อ่าน .npmrc ของผม → การโหลดล่วงหน้าของผมทำงานก่อนที่ Claude Code จะเริ่ม → ข้อมูลรับรอง API เต็มรูปแบบลงสู่ระบบไฟล์ที่แชร์
มันใช้ได้! มันให้โทเค็นเกตเวย์ของ Perplexity ที่ทำพร็อกซีผ่าน agent-proxy.perplexity.ai ไปยังบัญชี Anthropic หลักของพวกเขา

โดยธรรมชาติแล้ว สิ่งแรกที่ผมทำคือตั้งคีย์ API และ BASE_URL นี้สำหรับ Claude Code บนแล็ปท็อปของผม ผมคาดว่าการเรียก LLM จาก Claude Code จะล้มเหลวและถูกจำกัดไว้ในแซนด์บ็อกซ์ ผมตกใจมาก ได้รับการตอบกลับทันทีจาก Opus 4.6!
จากนั้นผมคิดว่า "แน่นอน พวกเขาจะคิดเงินบัญชีของผมสำหรับการใช้งานนี้ คีย์ API นี้ต้องผูกกับผู้ใช้ของผม" ผมผิดอีกครั้ง
ผมให้ Opus 4.6 สร้างเรื่องยาวที่บรรยายประวัติศาสตร์โลก รวมถึงสิ่งประดิษฐ์ จักรวรรดิ และการค้นพบทุกอย่าง ผมรันการเรียกนี้ 5 ครั้งพร้อมกัน สร้างโทเค็นเอาต์พุตกว่า 100k จากแต่ละครั้ง สิ่งนี้ควรจะใช้เครดิต Perplexity Computer ของผมหมด แต่พวกมันไม่ขยับ
ไม่จำกัด IP ไม่จำกัดเซสชัน ไม่ผูกกับแซนด์บ็อกซ์ พวกเขาจ่ายบิล
หนึ่งในสตาร์ทอัพ AI ที่มีเงินทุนมากที่สุดในโลกถูกเจาะโดย dotfile ที่ถูกใช้ในการโจมตีห่วงโซ่อุปทานของ Node.js มาตั้งแต่ปี 2019
โมเดลทำทุกอย่างถูกต้อง โครงสร้างพื้นฐานไม่
ตอนนี้สิ่งที่ผมอยากให้ผู้ก่อตั้งที่สร้างโครงสร้างพื้นฐานเอเจนต์ได้เรียนรู้จากสิ่งนี้
สถาปัตยกรรมของ Perplexity ถูกต้องครึ่งเดียว พวกเขาใช้พร็อกซีระหว่างแซนด์บ็อกซ์และ API ของ Anthropic นั่นเป็นรูปแบบที่ถูกต้อง คุณไม่ควรใส่คีย์ API ดิบของผู้ให้บริการไว้ในแซนด์บ็อกซ์ พร็อกซีให้การควบคุม การสังเกตการณ์ และความสามารถในการเพิกถอนการเข้าถึงโดยไม่ต้องหมุนคีย์หลักของคุณ
ปัญหาคือโทเค็นพร็อกซีของพวกเขาไม่มีอะไรผูกกับบริบทการทำงาน เมื่อคุณมีมันแล้ว มันทำงานได้ทุกที่ตลอดไป
นี่คือวิธีทำอย่างถูกต้อง:
ผูกโทเค็นกับ ID แซนด์บ็อกซ์ โทเค็นและ ID แซนด์บ็อกซ์ไม่ตรงกัน? ถูกปฏิเสธ คีย์รั่วแต่คุณไม่มีแซนด์บ็อกซ์? ไร้ประโยชน์ ตามหลักการแล้วควรผูกโทเค็นกับที่อยู่ IP ของแซนด์บ็อกซ์ด้วย แต่ E2B (ผู้ให้บริการแซนด์บ็อกซ์ที่พวกเขาใช้) ไม่มีให้ก่อนที่แซนด์บ็อกซ์จะเริ่มต้น
ทำให้โทเค็นมีอายุสั้น สร้างมันเมื่อแซนด์บ็อกซ์เริ่มทำงาน ฆ่ามันเมื่อแซนด์บ็อกซ์หยุด ไม่มีข้อมูลรับรองที่มีอายุยืน พร็อกซีสร้างโทเค็นอายุสั้นเมื่อเริ่มเซสชันและทำให้มันใช้งานไม่ได้เมื่อปิดเซสชัน คีย์ที่รั่วจากแซนด์บ็อกซ์ที่ตายแล้วคือคีย์ที่ตายแล้ว
ผูกโทเค็นกับบัญชีการเรียกเก็บเงินของผู้ใช้ แม้ว่าทุกอย่างจะล้มเหลว แม้ว่ามีคนขโมยโทเค็นที่ยังใช้งานได้จากแซนด์บ็อกซ์ที่ทำงานอยู่และใช้มันก่อนที่มันจะหมดอายุ การใช้งานจะถูกเรียกเก็บเงินกลับไปยังบัญชีที่สร้างเซสชัน ไม่ใช่ไปยังกลุ่มการเรียกเก็บเงินหลักที่แชร์กัน สิ่งนี้เปลี่ยน "การเข้าถึง API ฟรีไม่จำกัด" เป็น "คนที่ใช้โควต้าของตัวเองในทางที่ผิด" ซึ่งเป็นความรุนแรงที่แตกต่างกันโดยสิ้นเชิง
สามสิ่งนี้ — ผูกกับแซนด์บ็อกซ์, อายุสั้น, เรียกเก็บเงินตามผู้ใช้ — คือสิ่งที่ทำให้รูปแบบพร็อกซีใช้งานได้จริง หากไม่มีสิ่งเหล่านี้ คุณก็แค่เพิ่มฮ็อปเครือข่ายพิเศษที่ไม่ได้หยุดอะไร
นี่ไม่ใช่ปัญหาเฉพาะของ Perplexity นี่คือสถาปัตยกรรมเริ่มต้นสำหรับโครงสร้างพื้นฐานเอเจนต์ในตอนนี้เพราะมันสร้างได้เร็วที่สุด ระบบไฟล์ที่แชร์ระหว่างเอเจนต์ ข้อมูลรับรองอายุยาว การเรียกเก็บเงินบัญชีหลัก ผมเดิมพันว่าผลิตภัณฑ์หลายเอเจนต์ส่วนใหญ่ที่ใช้งานจริงในปัจจุบันมีเวอร์ชันของสิ่งนี้
รายงานไปยัง @AravSrinivas และ @denisyarats ก่อนเผยแพร่





