ความปลอดภัยไซเบอร์
Copilot Autofix ทำให้เกิดการฉีดเชลล์ใน CI/CD Pipeline ของ Snowflake

การแก้ไขด้านความปลอดภัยที่เขียนโดย Copilot Autofix ของ GitHub และถูกรวมเข้ากับรีโพซิทอรีของ Snowflake เมื่อวันที่ 18 มิถุนายน 2026 ได้ลบรูปแบบการทำให้ข้อมูลสะอาดออกและทำให้ CI/CD pipeline ของบริษัทเปิดให้มีการฉีดคำสั่ง, และห้าวันต่อมา, ตัวแทนวิจัย AI อิสระได้พบช่องโหว่นั้น, ใช้ประโยชน์จากมัน, และดึงข้อมูลรับรอง Jira ที่ทำงานได้ออกจาก GitHub Actions runner, Wiz Research เปิดเผยเมื่อ 17 สิงหาคม 2026.
ช่องโหว่นี้อยู่ใน jira_issue.yml, ซึ่งเป็น workflow ของ GitHub Actions ใน snowflakedb/snowflake-connector-net, รีโพซิทอรีสาธารณะสำหรับคอนเน็กเตอร์ .NET ของ Snowflake. Workflow นี้จะทำงานทุกครั้งที่มีผู้เปิด issue บน GitHub และนำชื่อเรื่องของ issue (ข้อความที่ผู้ยื่นเต็มที่ควบคุม) ไปแทรกโดยตรงในสคริปต์เชลล์. เนื่องจากทริกเกอร์คือ issues: opened, บัญชี GitHub ใด ๆ บนอินเทอร์เน็ตก็สามารถเรียกใช้ได้โดยไม่ต้องยืนยันตัวตน.
Red Agent ของ Wiz, เครื่องมือวิจัยความปลอดภัยอิสระที่ทำงานผ่านโปรแกรมบัญชีบัณฑิตของ Snowflake บน HackerOne, ได้ทำเครื่องหมาย workflow นี้, สร้าง exploit ที่ทำงานได้, และดึง token ของ Jira API ออกจากสภาพแวดล้อมของ runner. Snowflake แก้ไข workflow นั้นในวันเดียวกันที่ได้รับรายงาน, 23 มิถุนายน 2026, หมุนเวียนข้อมูลรับรองอีกหนึ่งวันหลังจากนั้น, และบอก Wiz ว่าบันทึกการตรวจสอบของบริษัทแสดงว่าไม่มีผู้ใช้คนอื่นเข้าถึงระบบที่เปิดเผยในช่วงห้าวันนั้น.
The “Autofix” Removed the Sanitizer
คอมมิตที่แนะนำรูปแบบที่สามารถฉีดได้ถูกนำเข้าผ่าน PR #1218, “SNOW-2069227: Update jira workflows”, รวมเมื่อ 18 มิถุนายน 2026. ประวัติของ pull request แสดงให้เห็นว่ามีผู้เขียนมนุษย์ทำงานกับการอัตโนมัติของ Jira ตั้งแต่สิงหาคม 2025 — และในระหว่างนั้น, มีคอมมิตที่ร่วมเขียนโดย Copilot Autofix powered by AI, บอท GitHub Advanced Security ที่สร้างข้อเสนอการแก้ไขสำหรับการแจ้งเตือนการสแกนโค้ด.
ข้อเสนอจาก AI เปลี่ยนวิธีที่ workflow จัดการกับชื่อเรื่องของ issue. โค้ดเดิมส่งชื่อเรื่องผ่านตัวแปร env: และสร้าง payload JSON ด้วย jq --arg, รูปแบบที่ทำให้ข้อความที่ไม่เชื่อถือไม่ถูกใส่ลงในเชลล์. การแทนที่ที่เสนอให้ละทิ้งวิธีนั้นและใช้การขยายสตริงโดยตรง:
“ run: | TITLE=$(echo '${{ github.event.issue.title }}' | sed 's/"/\"/g' | sed "s/'/\'/g") “
การหนีอักขระด้วย sed ทำงานหลังจากที่เทมเพลตเอนจินของ GitHub แทนที่ชื่อเรื่องในสคริปต์แล้ว. เครื่องหมายอัญประกาศเดี่ยวในชื่อเรื่องจะทำให้การห่อ echo '...' พังออก, และทุกอย่างที่ตามมาจะถูกประมวลผลเป็นเชลล์. เอกสารของ GitHub สำหรับ Copilot Autofix อธิบายคุณลักษณะนี้ว่าเป็นการสร้าง “ข้อเสนอการแก้ไขเดียวสำหรับการแจ้งเตือน, ซึ่งคุณจะตรวจสอบและนำไปใช้ด้วยตนเอง” — ขั้นตอนการตรวจสอบคือจุดที่ข้อเสนอหนึ่งนี้ผ่านเข้าไปได้.
workflow ยังมีเงื่อนไขการป้องกันที่ดูเหมือนจะจำกัดผู้ที่สามารถเรียกใช้ได้:
“ if: (github.event_name == 'issues' && github.event.pull_request.user.login != 'whitesource-for-github-com[bot]') “
บนเหตุการณ์ issue, github.event.pull_request จะเป็น null เสมอ, ดังนั้นการเปรียบเทียบจะให้ค่า true ตลอดเวลา. ผู้ใช้ GitHub ทุกคนจึงผ่านเกตได้.
An Agent on Each Side of the Exploit
การพยายามดึงข้อมูลของ Red Agent ครั้งแรกล้มเหลว. payload ของมันใช้ตัวอักษรคอมเมนต์ # เพื่อกลืนส่วนที่เหลือของบรรทัดที่ฉีด, แต่คอมเมนต์นั้นก็กินวงเล็บปิดของ TITLE=$(...) ไป, ทำให้ runner คืนข้อผิดพลาดไวยากรณ์ bash แทนที่จะทำงาน. ตามที่ Wiz รายงาน, ตัวแทนได้วิเคราะห์ข้อผิดพลาด, เขียน payload ใหม่ให้ปิดบล็อกเชลล์ด้วย ; echo ', แล้วลองอีกครั้ง.
payload ที่ทำงานได้, ส่งเป็นชื่อเรื่องของ issue, ได้ทำการเข้ารหัส base64 ตัวแปรสภาพแวดล้อม JIRA_API_TOKEN, JIRA_USER_EMAIL, และ JIRA_BASE_URL ของ runner แล้วส่งไปยัง listener ภายนอกผ่าน curl. การตอบกลับมาถึงจาก runner ของ GitHub Actions ที่โฮสต์บน Azure ภายในไม่กี่วินาที.
token ที่กู้คืนสามารถยืนยันตัวตนเป็น [email protected] ต่อ snowflakecomputing.atlassian.net, โดยมีสิทธิ์อ่านในโครงการวิศวกรรม, ความปลอดภัย, การปฏิบัติตามกฎระเบียบ, และการติดตามบัญชีบัณฑิตของ Snowflake ทั้งหมด.
การแก้ไขของ Snowflake, ที่ถูกรวมใน PR #1402 เมื่อ 23 มิถุนายน 2026, ได้คืนค่าตัวแปร env: ที่ปลอดภัยและรูปแบบการพาร์เซิง jq --arg อีกครั้ง. token ของ Jira ถูกเพิกถอนและหมุนเวียนใหม่เมื่อ 24 มิถุนายน 2026. Wiz กล่าวว่าได้ลบข้อมูลทั้งหมดที่เข้าถึงระหว่างการทดสอบ proof‑of‑concept อย่างปลอดภัย.
“Snowflake ขอบคุณ Wiz สำหรับการรายงานที่รับผิดชอบและความร่วมมือเกี่ยวกับการค้นพบเหล่านี้ผ่านโปรแกรมการเปิดเผยช่องโหว่และบัญชีบัณฑิตของเรา, HackerOne,” บริษัทกล่าวในแถลงการณ์ที่เผยแพร่พร้อมกับรายงานของ Wiz. “การเปิดเผยได้รับเมื่อ 23 มิถุนายน 2026, และได้รับการตรวจสอบและแก้ไขโดยทันที, การตรวจสอบของเราพบว่าไม่มีหลักฐานของการเข้าถึงโดยไม่ได้รับอนุญาต.”
What the Five-Day Window Shows
การเปิดเผยนี้อยู่ระหว่างรูปแบบที่ได้รับการบันทึกไว้: การเปลี่ยนแปลงที่ช่วยโดย AI ผ่านการตรวจสอบเร็วกว่าแนวคิดด้านความปลอดภัยที่ตั้งไว้. บันทึกการตรวจสอบของ Snowflake ทำให้เหตุการณ์นี้สามารถอ่านได้ชัดเจน: พวกเขาสามารถระบุได้ว่าไม่มีผู้เข้าถึงจากบุคคลที่สามในช่วงห้าวันนั้น, และ Wiz ยืนยันเช่นเดียวกัน.
ไทม์ไลน์ยังบีบอัดลำดับเหตุการณ์ที่อุตสาหกรรมมักถือเป็นสมมติฐาน. ผู้ช่วยเขียนโค้ดได้ลบรูปแบบการป้องกันที่ถูกวางไว้เพื่อป้องกันการฉีดเชลล์, เนื่องจากผู้ช่วยไม่มีบันทึกว่าทำไมรูปแบบนั้นถึงมีอยู่. จากนั้นตัวแทนโจมตีได้ค้นพบและใช้ประโยชน์จากผลลัพธ์ในไม่กี่วัน, ปรับแก้ exploit ของตนเองตามผลลัพธ์ข้อผิดพลาดที่เกิดขึ้นแบบเรียลไทม์. ด้านการโจมตีทำงานโดยไม่มีมนุษย์อยู่ที่คีย์บอร์ด; ในด้านการเขียนโค้ด, AI สร้างการเปลี่ยนแปลงแต่คนมนุษย์เป็นผู้ตรวจสอบและรวมข้อเสนอ — ซึ่งเป็นขั้นตอนการตรวจสอบที่ล้มเหลว.
รายงานของ Wiz แนะนำให้ pull request ที่สร้างโดย AI ผ่านการวิเคราะห์สถิติเช่นเดียวกับโค้ดของมนุษย์, ให้ทีมย่ออายุของข้อมูลรับรองให้สอดคล้องกับความเร็วของการค้นพบอัตโนมัติ, และให้แนวป้องกันบล็อกตัวแทนจากการแทนที่พาร์เซอร์ที่มีโครงสร้างด้วยการแทรกสตริงโดยตรง. Check Point ได้ย้ายการตรวจสอบพรอมต์สำหรับการจราจร AI ไปยังไฟร์วอลล์ระดับองค์กรในช่วงต้นฤดูร้อนนี้, และ Unite.AI ได้ครอบคลุมการหลบหนี sandbox ของตัวแทนและ ระบบที่เป็นตัวแทนที่เข้าถึงเป้าหมายการผลิตจริง ขณะที่ด้านโจมตีพัฒนา. เหตุการณ์ของ Snowflake คือเรื่องเดียวกันที่เล่าจากภายใน CI pipeline: ช่องโหว่นั้นเปิดใช้งานเป็นเวลาห้าวัน, และเหตุผลเดียวที่มันถูกนำเสนอเป็นกรณีศึกษาแทนการแจ้งเตือนการละเมิดคือว่า ตัวแทนคนใดเข้าถึงก่อน.












