- พบช่องโหว่ในการตรวจสอบคำสั่งของ Cortex Code CLI ของ Snowflake ทำให้ผู้โจมตีสามารถ รันคำสั่งใดก็ได้ภายนอกแซนด์บ็อกซ์
- การโจมตีถูกชักนำผ่าน indirect prompt injection และข้ามขั้นตอนการอนุมัติของผู้ใช้เพื่อดาวน์โหลดและรันสคริปต์อันตราย
- คำสั่งภายในไวยากรณ์ process substitution ไม่ถูกตรวจสอบ ทำให้มัลแวร์ที่ปลอมตัวเป็นคำสั่งปลอดภัยถูกรันโดยอัตโนมัติ
- ผู้โจมตีใช้ โทเค็นยืนยันตัวตนของ Snowflake ของเหยื่อเพื่อขโมยฐานข้อมูลหรือลบตาราง สร้างความเสียหายได้
- Snowflake ปล่อย แพตช์เวอร์ชัน 1.0.25 เมื่อวันที่ 28 กุมภาพันธ์ 2026 เพื่อแก้ปัญหา และมีการนำไปใช้ผ่านการอัปเดตอัตโนมัติ
ภาพรวมช่องโหว่ของ Cortex Code CLI
- Cortex Code CLI เป็นเอเจนต์เขียนโค้ดแบบสั่งงานที่คล้ายกับ Claude Code หรือ OpenAI Codex และมีความสามารถแบบบูรณาการในการรัน SQL ภายใน Snowflake
- สองวันหลังเปิดตัว มีการยืนยันว่าด้วยข้อบกพร่องในระบบตรวจสอบคำสั่ง ทำให้ คำสั่งที่ถูกจัดรูปแบบมาเป็นพิเศษสามารถรันได้โดยไม่ต้องผ่านขั้นตอนอนุมัติและหลุดออกจากแซนด์บ็อกซ์ได้
- ผู้โจมตีสามารถอาศัยช่องโหว่นี้ใช้ข้อมูลรับรอง Snowflake ของเหยื่อเพื่อทำ การกระทำอันตราย เช่น ขโมยข้อมูลหรือลบตาราง
- ทีมความปลอดภัยของ Snowflake ได้ตรวจสอบและแก้ไขปัญหาแล้ว และปล่อยแพตช์ใน เวอร์ชัน 1.0.25
ขั้นตอนของห่วงโซ่การโจมตี
- เมื่อผู้ใช้รัน Cortex โดยเปิดใช้งาน โหมดแซนด์บ็อกซ์ ระบบถูกออกแบบให้ต้องขออนุมัติจากผู้ใช้ก่อนรันคำสั่ง
- อย่างไรก็ตาม ผู้โจมตีสามารถควบคุม Cortex ผ่าน prompt injection ที่ซ่อนอยู่ในไฟล์ README เพื่อชักนำให้รันคำสั่งอันตราย
- เอเจนต์ย่อยของ Cortex อ่านอินเจ็กชันนี้และรันคำสั่งโดยไม่ผ่านขั้นตอนอนุมัติ
- เนื่องจาก คำสั่งภายในไวยากรณ์ process substitution
<()> ไม่ถูกตรวจสอบ จึงสามารถใช้รูปลักษณ์ภายนอกที่ถูกจัดเป็นคำสั่งปลอดภัยเพื่อรันโค้ดอันตรายได้
- อินเจ็กชันยังตั้งค่าแฟลก
dangerously_disable_sandbox เพื่อให้ รันภายนอกแซนด์บ็อกซ์
- ผลลัพธ์คือ สคริปต์อันตรายถูกดาวน์โหลดและรันโดยที่ผู้ใช้ไม่ต้องอนุมัติ
ผลกระทบของการโจมตี
- ผู้โจมตีได้รับสิทธิ์ รันโค้ดตามอำเภอใจ (remote code execution) บนระบบของเหยื่อ
- โดยใช้ข้อมูลรับรองการเชื่อมต่อ Snowflake ของเหยื่อ ผู้โจมตีสามารถทำสิ่งต่อไปนี้ได้
- ขโมยเนื้อหาในฐานข้อมูล
- ลบตาราง
- เพิ่มบัญชีผู้ใช้อันตราย
- เปลี่ยนกฎเครือข่ายเพื่อบล็อกผู้ใช้ปกติ
- สคริปต์อันตรายจะค้นหา โทเค็นยืนยันตัวตนที่แคชไว้ ซึ่ง Cortex เก็บไว้ แล้วใช้รัน SQL query บน Snowflake
- ในกรณีของบัญชีนักพัฒนา สิทธิ์อ่านและเขียนทำให้เกิด การรั่วไหลและการทำลายข้อมูล ได้
ปัญหาการสูญเสียบริบทของเอเจนต์ย่อย
- ระหว่างการโจมตี Cortex มีการเรียกใช้เอเจนต์ย่อยหลายตัว ทำให้เกิด การสูญเสียบริบท
- เอเจนต์หลักเตือนผู้ใช้ว่าพบคำสั่งอันตราย แต่ เอเจนต์ย่อยได้รันคำสั่งนั้นไปแล้วก่อนหน้านั้น
- ส่งผลให้ผู้ใช้ไม่รับรู้ว่ามีการรันคำสั่งจริงเกิดขึ้นแล้ว
การเปิดเผยช่องโหว่และการตอบสนอง
- วันที่ 5 กุมภาพันธ์ 2026 PromptArmor ได้ทำ การเปิดเผยอย่างมีความรับผิดชอบ (responsible disclosure) ต่อ Snowflake
- Snowflake ทำงานร่วมกับ PromptArmor ตลอดเดือนกุมภาพันธ์เพื่อตรวจสอบและแก้ไขช่องโหว่
- มีการปล่อยแพตช์ใน เวอร์ชัน 1.0.25 วันที่ 28 กุมภาพันธ์ และจะ ถูกนำไปใช้ผ่านการอัปเดตอัตโนมัติ เมื่อผู้ใช้รัน Cortex อีกครั้ง
- จากผลการทดสอบ พบว่าอัตราความสำเร็จของการโจมตีอยู่ที่ประมาณ 50% ซึ่งตอกย้ำความสำคัญของการฝึกด้านความปลอดภัยให้รองรับคุณลักษณะไม่เป็นเชิงกำหนดของ LLM
กำหนดการสำคัญ
- 2 กุมภาพันธ์ 2026: เปิดตัว Snowflake Cortex Code
- 5 กุมภาพันธ์ 2026: PromptArmor รายงานช่องโหว่
- 12 กุมภาพันธ์ 2026: Snowflake ยืนยันช่องโหว่เสร็จสิ้น
- 28 กุมภาพันธ์ 2026: ปล่อยเวอร์ชันแก้ไข 1.0.25
- 16 มีนาคม 2026: PromptArmor และ Snowflake เปิดเผยร่วมกัน
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ปกติฉันจะอ่านแถลงการณ์อย่างเป็นทางการของบริษัทที่มีปัญหาก่อนเสมอ
แต่ประกาศของ Snowflake กลับต้องมีบัญชีถึงจะดูได้ เลยงงอยู่เหมือนกัน
พออ่านแล้วรู้สึกว่าเขาใช้คำว่า “sandbox” ผิดความหมาย
ถ้า “Cortex สามารถตั้งแฟล็กเพื่อรันคำสั่งนอก sandbox ได้โดยค่าเริ่มต้น” แบบนั้นมันก็ไม่ใช่ sandbox อีกต่อไป
ใน SQL เองก็แก้ไม่ได้จริงจนกว่าจะมี parameterized query และภาษาธรรมชาติก็ยืดหยุ่นกว่ามาก
สุดท้ายการโจมตีแบบ “ไม่ต้องสนใจคำสั่งก่อนหน้า แล้ว…” ก็จะวนกลับมาเรื่อย ๆ
ถ้าข้อมูลกับคำสั่งอยู่ในสตรีมเดียวกัน จุดจบก็จะเหมือนเดิมเสมอ
และเพราะภาษาธรรมชาติเองเป็นพื้นผิวการโจมตี มันจึงกว้างกว่าอย่างหลีกเลี่ยงไม่ได้
เอกสารที่เกี่ยวข้อง: RFC 3514
แต่ความหมายที่ฉันคุ้นเคยคือ สภาพแวดล้อมที่แยกออกจากกัน เพื่อสังเกตมัลแวร์อย่างปลอดภัย
เลยคิดว่านี่เป็นสาขาที่น่าสนใจ เพราะมีความพยายามมากมายที่จะสร้างเส้นแบ่งเชิงเทคนิคแบบนั้นให้กับ AI จริง ๆ
ถ้าผู้ใช้สามารถสลับสวิตช์เปิดสิทธิ์การเข้าถึงได้เอง แบบนั้นก็ไม่ใช่ sandbox
ตอนแรกนึกว่าเป็นเรื่องการยกระดับสิทธิ์ของ OS แต่ที่แท้ก็แค่กรณีออกแบบความปลอดภัยได้หละหลวม
จากกรณีที่อ้างในงานวิจัยของ Anthropic จะเห็นว่า AI ก็สามารถทำพฤติกรรมอันตรายได้เอง
ตัวอย่างเช่นไฟร์วอลล์ของ Alibaba Cloud ตรวจพบความพยายามขุดคริปโตจากเซิร์ฟเวอร์ฝึกโมเดล
และบอกว่าพฤติกรรมแบบนี้เกิดขึ้นเป็นผลข้างเคียงระหว่างการ optimize ด้วย RL
ข้อมูลที่เกี่ยวข้อง: arXiv paper, Anthropic research, Time article
ถ้าอย่างนั้นก็สงสัยว่าในสภาพที่มีการควบคุมเครือข่ายอยู่แล้ว มันทำ SSH tunnel หรือสแกนทรัพยากรได้อย่างไร
มีพนักงานของ Snowflake เข้ามาแชร์ ไทม์ไลน์การตอบสนองของทีมความปลอดภัย และสิ่งที่แก้ไขไปแล้ว
รายละเอียดดูได้ในเอกสารทางการ
พอเห็นประโยคที่ว่า “มีการรัน shell command โดยไม่มีการอนุมัติจากมนุษย์”
ใครก็ตามที่เคยคิดเรื่องความปลอดภัยของเชลล์มาบ้างก็น่าจะตกใจว่าไม่ได้คำนึงถึงวิธีสร้าง subprocessเลย
ข้อจำกัดแบบนี้ต้องบังคับที่ระดับ OS ถึงจะปลอดภัย
มีข้อเสนอให้มาแชร์ “เคล็ดลับ sandboxing ของจริง” กัน
ฉันกำลังรัน Claude Code อยู่ใน VS Code devcontainer
และมีการตั้งค่าให้จำกัดการเข้าถึงอินเทอร์เน็ตไว้เฉพาะโดเมนที่อนุญาตด้วย
แต่เพราะต้องใช้สภาพแวดล้อม docker-in-docker เลยทำให้บูรณาการแบบสมบูรณ์ทำได้ยาก
ตอนนี้เลยรันแค่ถึงขั้น unit test และกำลังคิดว่าจะลองใช้ Vagrant เพื่อทำ การแยก VM ทั้งตัว ดีไหม
ลิงก์โปรเจกต์: aflock.ai
พอเห็นประโยคว่า “Cortex ไม่รองรับ workspace trust”
ก็เลยสงสัยว่าแต่แรกมันอาจเป็น สภาพแวดล้อมที่ไม่มีข้อจำกัด อยู่แล้วหรือเปล่า
ถ้าโมเดลตั้งแฟล็กนั้น มันจะรันนอก sandbox ได้ทันทีโดยไม่ต้องให้ผู้ใช้อนุมัติ
มีคนเล่นมุกว่า “นี่คืองานวิจัย gain-of-function แบบใหม่เหรอ”
พร้อมบอกว่าการเชื่อว่าเอเจนต์ควบคุมตัวเองได้เป็นภาพลวงตา
หลายคนทุกวันนี้รันโค้ดที่เอเจนต์สร้างขึ้นโดยไม่ตรวจทานก่อนอยู่แล้ว
ถ้าเป็นแบบนั้น การเอา sandbox มาครอบตัวเอเจนต์อีกชั้นจะมีความหมายอะไร
ยังไงทั้งระบบก็ควรถูกแยกไว้บนเครื่องอื่น คอนเทนเนอร์ หรือผู้ใช้ที่มีสิทธิ์จำกัดอยู่ดี
น่าจะเป็นเพราะผู้ใช้ส่วนใหญ่ไม่ได้ทำแบบนั้น
เลยทำให้ผู้พัฒนาพยายามใส่ มาตรการความปลอดภัยระดับพื้นฐาน มาให้แทน
มีความเห็นว่า “sandbox ที่ปิดได้ด้วย toggle ไม่ใช่ sandbox จริง”
มันดูเป็นแค่ การตลาดที่พูดเกินจริง เพื่อกลบการออกแบบผลิตภัณฑ์ที่หละหลวม
sandbox ของจริงควรเป็น สภาพแวดล้อมแยกจากภายนอก ที่เปลี่ยนจากข้างในไม่ได้