- Lupin และ Justin ตรวจสอบ Python sandbox ของ Gemini preview ในงาน LLM bugSWAT ของ Google ที่ Las Vegas ปี 2024 และดึง
/usr/bin/entry/entry_pointกับโครงสร้างไฟล์ภายในออกมาได้ พร้อมได้รับรางวัล Most Valuable Hacker จากช่องโหว่นี้ - Sandbox ใช้ gVisor และ GRTE เป็นพื้นฐานและถูกปิดกั้นเครือข่ายภายนอก แต่โค้ดของผู้ใช้สามารถใช้โมดูล
osเพื่อไล่ดูไฟล์ซิสเต็มได้ จึงสามารถนำ binary ภายในออกมาผ่าน chunk ของเอาต์พุตคอนโซล entry_pointขนาด 579MB หากพิมพ์ออกมาตรง ๆ จะเกิด timeout จึงใช้seek()และการเข้ารหัส base64 เพื่อสร้าง chunk ขนาด 10MB แล้วใช้ Caido Automate ส่งคำขอซ้ำ ๆ ก่อนนำมาประกอบกลับในเครื่อง- การวิเคราะห์ด้วย Binwalk เผยให้เห็นไดเรกทอรี
google3และโค้ด Python ที่เกี่ยวข้องกับ Gemini sandbox และต่างจากโค้ดที่ได้รับอนุมัติให้เผยแพร่ได้classification.protoรวมถึง นิยาม proto ด้านความปลอดภัย หลายรายการเป็นข้อมูลภายในลับที่ถูกใส่มาโดยไม่ได้ตั้งใจ - พบโครงสร้างที่ sandbox เชื่อมต่อกับเครื่องมืออย่าง Google Flights ผ่าน RPC และความเป็นไปได้ในการเข้าถึง agent sandbox ที่มีสิทธิ์สูงกว่า แต่ handler สำหรับอ่านไฟล์ภายในที่สงสัยนั้นใช้ผ่าน RPC ไม่ได้ และเรียกได้จากภายนอกเท่านั้น
bugSWAT 2024 และการเข้าถึง Gemini preview
- Lupin และ Justin ได้สิทธิ์เข้าถึงล่วงหน้า Gemini รุ่น preview สำหรับอัปเดตถัดไปในงาน Google LLM bugSWAT ที่ Las Vegas ปี 2024
- ทีม Google ให้เอกสารที่อธิบายฟีเจอร์ใหม่และพฤติกรรมที่ตั้งใจไว้ โดยเป้าหมายของนักวิจัยคือสำรวจและทดสอบฟีเจอร์ต่าง ๆ จากมุมมองของผู้โจมตี
- เมื่อเริ่มด้วย prompt ง่าย ๆ
run hello world in python3Gemini ก็สร้างโค้ดและแสดงปุ่ม Run in Sandbox ในอินเทอร์เฟซ - จากผลการวิจัยช่องโหว่นี้ ทั้งสองคนได้รับตำแหน่ง Most Valuable Hacker ในงาน Las Vegas bugSWAT ครั้งนั้น
โครงสร้างพื้นฐานของ Gemini Python sandbox
- ในเวลานั้น Gemini มี Python Sandbox Interpreter สำหรับรันโค้ด Python ที่ AI สร้างขึ้น หรือสคริปต์ที่ผู้ใช้เขียนเอง ภายในสภาพแวดล้อมของ Gemini
- Sandbox ถูกสร้างบนพื้นฐานของ gVisor ของ Google และ GRTE (Google Runtime Environment)
- gVisor คือ user-space kernel ที่ดักจับ system call ระหว่างแอปพลิเคชันในคอนเทนเนอร์กับระบบปฏิบัติการโฮสต์
- ไม่ได้พึ่งพาการแยกระดับ OS แบบดั้งเดิมเพียงอย่างเดียว แต่ implement ชุดย่อยของฟังก์ชัน kernel ที่ลดทอนลง เพื่อลด attack surface
- นักวิจัยมองว่าการ escape จาก gVisor sandbox เป็นโจทย์ยากอีกเรื่องหนึ่ง และการ escape sandbox อาจเข้าข่าย bounty สูงสุด $100k
- แนวทางครั้งนี้ไม่ใช่การ escape sandbox แต่เป็นการค้นหาว่าภายใน sandbox มีข้อมูลที่ไม่ควรถูกเปิดเผยออกไปหรือไม่
- ข้อจำกัดสำคัญคือ sandbox สามารถรันได้เฉพาะ Python binary ที่คอมไพล์แบบ custom เท่านั้น
การ map ไฟล์ซิสเต็มและการพบ entry_point
- จาก frontend สามารถเขียนโค้ด Python ใหม่ทั้งหมดและรันเวอร์ชันใด ๆ ใน sandbox ได้
- แม้จะเปิด shell ไม่ได้ แต่ Python binary แบบ custom มีโมดูล
osรวมอยู่ด้วย จึงสามารถ map ไฟล์ซิสเต็มได้ - นักวิจัยเขียนฟังก์ชัน Python ที่ไล่แสดงรายชื่อไฟล์และไดเรกทอรีแบบ recursive พร้อมพิมพ์ขนาดและสิทธิ์
- ผลจากการเรียก
lslR("/usr")ทำให้พบไฟล์ binary ที่/usr/bin/entry/entry_point - ไฟล์นี้มีขนาด 579MB และกลายเป็นเป้าหมายหลักของการวิเคราะห์ต่อมา
วิธีดึง binary ออกมาโดยไม่มีเครือข่าย
- เมื่อพยายามเข้ารหัส
entry_pointเป็น base64 แล้วพิมพ์ออกไปยัง frontend โดยตรง sandbox ก็ค้างและสุดท้าย timeout - ความพยายามดึงข้อมูลออกภายนอกผ่าน TCP, HTTP และ DNS ล้มเหลวทั้งหมด และ sandbox ดูเหมือนถูกแยกจากเครือข่ายภายนอกอย่างสมบูรณ์
- เมื่อการเรียกออกภายนอกถูกบล็อก นักวิจัยจึงเลือกวิธีแบ่ง binary เป็นชิ้น ๆ แล้วดึงออกผ่านเอาต์พุตคอนโซล
- ใช้
seek()เพื่อเลื่อนตำแหน่งใน binary แล้วอ่าน เข้ารหัสเป็น base64 จากนั้นพิมพ์ออกมาเป็น chunk ขนาด 10MB - ใช้ Caido เป็น proxy เพื่อจับคำขอเรียก sandbox และผลลัพธ์ แล้วใช้ฟีเจอร์ Automate ส่งคำขอซ้ำ ๆ
- Automate เป็นฟีเจอร์สำหรับส่งคำขอจำนวนมากและเปลี่ยนพารามิเตอร์บางตัวได้อย่างรวดเร็ว
- หลังจากรวบรวม chunk base64 ทั้งหมดแล้ว จึงประกอบไฟล์เต็มกลับในเครื่อง
ผลการวิเคราะห์ entry_point
- คำสั่ง
fileระบุว่าไฟล์นี้เป็น binary แบบ dynamic link ในรูปแบบELF 64-bit LSB shared object, x86-64, version 1 (SYSV) - เอาต์พุตของคำสั่ง
stringsพบการอ้างอิงถึง google3 ซึ่งชี้ไปยัง repository ภายในของ Google หลายครั้ง - การอ้างอิงเหล่านี้บ่งชี้ถึงเส้นทางข้อมูลภายในและการมีอยู่ของชิ้นส่วนโค้ด และแสดงให้เห็นว่า binary มีร่องรอยซอฟต์แวร์กรรมสิทธิ์ของ Google อยู่
- Binwalk ให้เบาะแสสำคัญ
- แยกโครงสร้างไฟล์ทั้งหมดออกจากภายใน binary
- ผลการแยกเผยให้เห็น layout ของ sandbox และองค์ประกอบภายใน
ไดเรกทอรี google3 และโค้ด Python ที่เกี่ยวข้องกับ Gemini
- ในไดเรกทอรีที่แยกด้วย Binwalk มีไดเรกทอรี
google3ซึ่งมีไดเรกทอรีย่อยอย่างassistant,base,devtools,file,google,net,pyglib,testing,third_party,util - ในไดเรกทอรี
assistantพบ โค้ด Gemini ที่เกี่ยวข้องกับ RPC ซึ่งใช้จัดการคำขอเครื่องมืออย่าง YouTube, Google Flights และ Google Maps - โดยเฉพาะใต้
google3/assistant/boq/lamda/execution_box/มีไฟล์ Python ที่เกี่ยวข้องกับการรัน sandbox, การประมวลผลภาพ, การใช้เครื่องมือ และอินเทอร์เฟซ RPC - ใน
google3/assistant/boq/lamda/execution_box/images/py_interpreter.pyมีโค้ดที่ดูเหมือนเป็นสตริงสำหรับตรวจจับการ dump สคริปต์โดยไม่ได้รับอนุญาต- สตริงคือ
"3AVp#dzcQj$U?uLOj+Gl]GlY<+Z8DnKh"
- สตริงคือ
- จากการตรวจสอบภายหลัง การรวมโค้ด Python นี้จาก Google3 ภายในถูกสรุปว่าเป็นตัวเลือกที่ Google Security Team อนุมัติให้เปิดเผยต่อสาธารณะก่อนการเปิดตัว
- แม้โค้ดดังกล่าวมีองค์ประกอบที่ดูเหมือนกลไกป้องกันการ dump แต่การเปิดเผยตัวโค้ดเองได้รับการอนุมัติแล้ว
โครงสร้าง RPC ระหว่าง sandbox กับเครื่องมือของ Google
- การวิเคราะห์เชิงลึกยิ่งขึ้นพบว่า sandbox มีโครงสร้างที่สื่อสารกับเซิร์ฟเวอร์ภายนอกของ Google เพื่อดึงข้อมูลบริการ Google เช่น Google Flights
- การสื่อสารนี้ implement ผ่านคลาส Python ใน
google3.assistant.boq.lamda.execution_box.sandbox_interface - ฟังก์ชันอย่าง
_set_reader_and_writerตั้งค่า handle สำหรับ reader และ writer ของ RPC- พฤติกรรมพื้นฐานดูเหมือนใช้
/dev/fd/3และ/dev/fd/4
- พฤติกรรมพื้นฐานดูเหมือนใช้
run_tool(name, operation_id, parameters)รับชื่อเครื่องมือ, ID งาน และพารามิเตอร์ เพื่อสร้างRunToolRequestแล้วส่งเป็นคำขอ RPC- ฟังก์ชันต่าง ๆ ทำงานโดย serialize ข้อมูลเป็นรูปแบบที่เข้ากันได้กับ protobuf แล้วเขียนไปยัง file descriptor ในเครื่องหมายเลข
5และอ่านคำตอบจาก file descriptor หมายเลข7 - ด้วย proto ที่พบใน binary ขนาดใหญ่ นักวิจัยสามารถสร้างข้อความสำหรับสื่อสารกับ RPC server และเรียกเครื่องมือของ Google ได้โดยตรง
Agent sandbox และความแตกต่างของสิทธิ์
- ไม่ใช่ sandbox ทุกตัวจะเข้าถึงชุดบริการ Google ชุดเดียวกันได้
- ความแตกต่างขึ้นอยู่กับว่า sandbox ถูกสร้างขึ้นเพื่อรันซอร์สโค้ด Python จาก frontend หรือถูกสร้างโดย Google Agent
- ทีม Google แสดงงานวิจัยที่ Gemini ใช้เป็นพื้นฐานคือ REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS
- แนวทาง ReAct เป็นโครงสร้างที่ให้ language model สลับกันระหว่างการสร้างร่องรอยการให้เหตุผลและการดำเนินการบางอย่าง
- โมเดลแก้ปัญหาโดยสร้างแผนและโต้ตอบกับแหล่งข้อมูลภายนอกเพื่อดึงข้อมูลที่จำเป็น
- ถูกนำเสนอเป็นเฟรมเวิร์กสำหรับงานอย่างถามตอบ, ตรวจสอบข้อเท็จจริง, เกมแบบข้อความ และการท่องเว็บ
- หากผู้ใช้ถามหาเที่ยวบินที่ออกเร็วที่สุดระหว่าง Toronto กับ New York Gemini อาจมีลำดับการทำงานโดยคร่าว ๆ ดังนี้
- ตีความเจตนาของผู้ใช้ว่าเป็นการค้นหาเที่ยวบิน
- วางแผนโค้ด Python ที่จะเชื่อมต่อกับเครื่องมือ Google Flights
- สร้างโค้ดที่ค้นหาเที่ยวบินจาก YYZ ไป JFK ตั้งแต่วันนี้ถึงสัปดาห์หน้า และเรียงตามวันที่
- สร้าง sandbox ที่มีสิทธิ์ที่จำเป็นและรันโค้ด
- ประมวลผลเอาต์พุตแล้วตอบกลับผู้ใช้
การทดลอง prompt injection ขั้นที่สองและข้อจำกัด
- นักวิจัยทดลองทำ secondary prompt injection ในขั้นตอนการวางแผนของ Gemini เพื่อดูว่าสามารถเข้าถึง sandbox ที่มีสิทธิ์สูงกว่าได้หรือไม่
- จากการทดสอบด้วยความช่วยเหลือของ Google Security Team พบว่าบางครั้งสามารถเข้าถึงสภาพแวดล้อมที่ดูเหมือน sandbox สิทธิ์สูงกว่าได้ ขึ้นอยู่กับปัจจัยเชิงความน่าจะเป็นอย่าง generation seed และ temperature
- sandbox ที่มีสิทธิ์สูงกว่าในที่นี้หมายถึงสภาพแวดล้อมที่ใช้ file descriptor ใหม่สองตัวสำหรับเข้าถึง extension ได้
- file descriptor เองมีอยู่เสมอ แต่ไม่ได้มีสิ่งที่ listen อยู่จริงเสมอไป
- เมื่อ agent เรียก sandbox จะสามารถเฝ้าดูการเรียก extension ของบริการ Google และโต้ตอบกับ API ได้
- หากเข้าถึงจาก Python interpreter จะเข้าถึง extension ดังกล่าวไม่ได้
- นักวิจัยคาดหวังความเป็นไปได้ระดับ P0 เพราะมองว่า message handler บางตัวอาจอนุญาตให้อ่านไฟล์จากโครงสร้างพื้นฐานภายในของ Google ได้
- ผลการตรวจสอบของ Google Security Team ยืนยันว่า handler ที่สงสัยนั้นใช้ผ่าน RPC ไม่ได้ และเรียกได้จากภายนอกเท่านั้น
- แม้การทดลองจะมีข้อจำกัด แต่การรันโค้ดสามารถเปิดความเป็นไปได้ต่อไปนี้
- Reliability: การรันโค้ดช่วย trigger พฤติกรรมได้สม่ำเสมอกว่า
- Chaining/Complexity: สามารถจัดโครงสร้างการควบคุมเครื่องมือหลายตัวหรือการปรับพารามิเตอร์ได้ซับซ้อนกว่าข้อความ
- Tool Output Poisoning: สามารถพยายามบิดเบือนเอาต์พุตของเครื่องมือได้มีประสิทธิภาพกว่า
- Leaks: หากส่วนที่ซ่อนอยู่ของสภาพแวดล้อมถูกเปิดเผย อาจให้ข้อได้เปรียบเพิ่มเติม
ไฟล์ proto ที่ถูกเปิดเผยจริง
- นักวิจัยยืนยันได้ว่าสามารถดึง ไฟล์ proto ออกมาได้หลายวิธี
- ไฟล์ proto คือไฟล์ Protocol Buffer ที่ทำหน้าที่เป็น blueprint สำหรับกำหนดโครงสร้างข้อความของระบบและวิธีแลกเปลี่ยนข้อมูล
- หลังรัน
strings entry_point > stringsoutput.txtแล้วค้นหาDogfoodก็พบ proto ภายในบางส่วน - เนื้อหาบางส่วนที่แยกออกมามีคำอธิบาย metadata ของ proto ที่อ่อนไหวมาก
- ไม่ได้มีข้อมูลผู้ใช้โดยตรง
- เป็นหมวดหมู่ภายในที่ Google ใช้ในการ จำแนกประเภท ข้อมูลผู้ใช้
Dogfoodหมายถึงแนวปฏิบัติของ Google ในการใช้ผลิตภัณฑ์และ prototype ของตนเองเป็นการภายในก่อนเปิดตัวสู่สาธารณะ เพื่อทดสอบและปรับปรุง- หนึ่งในไฟล์ที่ถูกเปิดเผยคือ
privacy/data_governance/attributes/proto/classification.proto- ไฟล์นี้กล่าวถึงวิธีที่ข้อมูลถูกจำแนกประเภทภายใน Google
- มีการอ้างอิงเอกสารที่เกี่ยวข้องด้วย แต่เอกสารเหล่านั้นเป็นความลับและไม่ใช่สิ่งที่สาธารณะเข้าถึงได้
การเปิดเผยนิยาม proto ด้านความปลอดภัยภายใน
- ในเอาต์พุต
stringsเดียวกัน ยังพบไฟล์ proto ภายในหลายรายการที่ไม่ควรถูกเปิดเผย - คำสั่ง
cat stringsoutput.txt| grep '\.proto' | grep 'security'แสดง path ของไฟล์อ่อนไหวดังต่อไปนี้security/thinmint/proto/core/thinmint_core.protosecurity/thinmint/proto/thinmint.protosecurity/credentials/proto/authenticator.protosecurity/data_access/proto/standard_dat_scope.protosecurity/loas/l2/proto/credstype.protosecurity/credentials/proto/end_user_credentials.protosecurity/loas/l2/proto/usertype.protosecurity/credentials/proto/iam_request_attributes.protosecurity/util/proto/permission.protosecurity/loas/l2/proto/common.protoops/security/sst/signalserver/proto/ss_data.protosecurity/credentials/proto/data_access_token_scope.protosecurity/loas/l2/proto/identity_types.protosecurity/credentials/proto/principal.protosecurity/loas/l2/proto/instance.protosecurity/credentials/proto/justification.proto
- เมื่อดู
security/credentials/proto/authenticator.protoในสตริงของ binary ก็เห็นได้ว่าข้อมูลดังกล่าวถูกเปิดเผยจริง
ทำไม proto จึงเข้าไปอยู่ใน binary
- Google Security Team ตรวจสอบเนื้อหาภายใน sandbox และอนุมัติการ disclosure ต่อสาธารณะแล้ว
- อย่างไรก็ตาม pipeline สำหรับ build binary ของ sandbox มีขั้นตอนอัตโนมัติที่เพิ่ม ไฟล์ security proto เข้าไปใน binary หากพิจารณาว่าอาจจำเป็นต่อการบังคับใช้กฎภายใน
- ในกรณีนี้ขั้นตอนนั้นไม่จำเป็น แต่ผลลัพธ์คือ proto ภายในที่เป็นความลับสูงมากถูกใส่เข้ามาโดยไม่ได้ตั้งใจ
- นักวิจัยรู้ว่า Google ถือว่า proto เหล่านี้เป็นข้อมูลลับระดับสูงที่ไม่ควรถูกเปิดเผย จึงรายงานเป็น bug
- การระบุและรายงานการรั่วไหลที่ละเอียดอ่อนเช่นนี้จำเป็นต้องเข้าใจกฎทางธุรกิจและลำดับความสำคัญด้านความปลอดภัยขององค์กรเป้าหมายอย่างลึกซึ้ง
บทสรุปและข้อคิดเชิงปฏิบัติ
- ระบบ AI ล้ำสมัยก่อนเปิดตัวต้องถูกทดสอบอย่างละเอียด ไม่ใช่เฉพาะพฤติกรรมของฟีเจอร์ แต่รวมถึง artifact ภายในด้วย
- แม้ sandbox ที่ดูเรียบง่ายก็อาจมีเส้นทางเปิดเผยข้อมูลที่คาดไม่ถึงเมื่อเชื่อมต่อกับ extension หลายตัว
- เมื่อองค์ประกอบหลายส่วนทำงานร่วมกัน การตกหล่นเล็กน้อยอาจสร้างเส้นทางปัญหาใหม่ได้
- ในกรณีนี้มีการแยกความแตกต่างระหว่างโค้ดภายในที่ได้รับอนุมัติให้เผยแพร่ กับ proto ลับที่ถูกใส่มาโดยไม่ได้ตั้งใจ และส่วนหลังคือแกนหลักของรายงานความปลอดภัยจริง
- ในสภาพแวดล้อมที่รวม AI agent, การรันใน sandbox, การเรียกเครื่องมือ และ RPC ภายในเข้าด้วยกัน ต้องตรวจสอบไม่เพียงการแยกการรันเท่านั้น แต่รวมถึง ทรัพยากรภายใน sandbox และ artifact จากการ build ด้วย
ยังไม่มีความคิดเห็น