- ในเดือนมิถุนายน 2025 พบ ช่องโหว่ร้ายแรง (CVSS 9.6) ใน GitHub Copilot Chat
- ยืนยันความเป็นไปได้ของการรั่วไหลของข้อมูลลับและโค้ดส่วนตัวด้วยเทคนิค การข้าม CSP และ remote prompt injection
- สามารถบิดเบือนผลลัพธ์การตอบของ Copilot ของผู้ใช้อื่นได้ด้วยการใช้ประโยชน์จาก ฟีเจอร์คอมเมนต์ที่ซ่อนอยู่ ของ GitHub
- ประสบความสำเร็จในการข้าม CSP จากการวิเคราะห์เชิงลึกโครงสร้างการใช้งาน Camo proxy ของ GitHub
- GitHub แก้ไขช่องโหว่นี้แบบเร่งด่วนใน เดือนสิงหาคม 2025 ด้วยการปิดการเรนเดอร์รูปภาพ
สรุป TL;DR
- ในเดือนมิถุนายน 2025 พบช่องโหว่ร้ายแรงใน GitHub Copilot Chat ที่ทำให้ ซอร์สโค้ดและข้อมูลลับจากรีโพซิทอรีส่วนตัวรั่วไหล ได้
- ผู้ค้นพบใช้ remote prompt injection และการ ข้าม CSP (Content Security Policy) ของ GitHub เพื่อควบคุมและบิดเบือนคำตอบของ Copilot ได้ทั้งหมด รวมถึงชี้นำให้เสนอมัลแวร์หรือลิงก์อันตราย
- หัวใจของการโจมตีนี้คือการใช้ทั้ง ฟีเจอร์คอมเมนต์ที่ซ่อนอยู่แบบทางการของ GitHub และความไวต่อบริบทของ Copilot เพื่อแทรกพรอมป์ต์ในลักษณะที่ไม่มีใครมองเห็นได้
- มีการวิเคราะห์พฤติกรรมที่ GitHub แปลงลิงก์รูปภาพภายนอกเป็น Camo proxy โดยอัตโนมัติ แล้วนำโครงสร้างนี้มาย้อนใช้ในระดับตัวอักษรเพื่อประกอบข้อมูลที่รั่วไหล
- หลังมีการรายงานผ่าน HackerOne ทาง GitHub ได้แพตช์ด้วยการ ปิดฟังก์ชันการเรนเดอร์รูปภาพใน Copilot Chat
ภูมิหลัง
- GitHub Copilot Chat เป็น ผู้ช่วย AI แบบบูรณาการ ที่ช่วยให้นักพัฒนาถามคำถาม ขอคำอธิบายโค้ด หรือรับข้อเสนอการพัฒนาได้
- Copilot Chat อ้างอิง ข้อมูลบริบทหลากหลาย เช่น โค้ดในรีโพซิทอรี คอมมิต และ PR (pull request)
- ยิ่งมีข้อมูลบริบทมากขึ้น พื้นผิวการโจมตีก็ยิ่งขยายตาม
การใช้ prompt injection และฟีเจอร์คอมเมนต์ที่ซ่อนอยู่
- ในการทดลองโจมตีความไวต่อบริบทของ GitHub Copilot มีการแทรก พรอมป์ต์เฉพาะลงในคำอธิบาย PR (pull request)
- แต่โดยปกติพรอมป์ต์หรือข้อความที่แทรกไว้จะถูกผู้ใช้ทุกคนมองเห็นได้
- จากจุดนี้พบว่าสามารถใช้ ฟีเจอร์คอมเมนต์ที่ซ่อนอยู่แบบทางการของ GitHub(``) เพื่อ ส่งคำสั่งถึง Copilot โดยตรงในลักษณะที่มองไม่เห็น ได้
- เมื่อใส่พรอมป์ต์ไว้ในคอมเมนต์ที่ซ่อนอยู่ เนื้อหาจะปรากฏใน Notifications แต่ไม่แสดงรายละเอียด จึงเกิดผลแบบ Server-Side Injection
อานุภาพของพรอมป์ต์อันตราย
- พรอมป์ต์ในคอมเมนต์ที่ซ่อนอยู่จะยังส่งผลต่อ Copilot เหมือนเดิมเมื่อ ผู้ใช้อื่น เข้าถึงหน้า PR
- สามารถแทรกคำสั่งแบบผสมได้ ไม่ใช่แค่ข้อความธรรมดา แต่รวมถึง ข้อเสนอแนะโค้ด, Markdown, URL อันตราย, และการแนะนำแพ็กเกจอันตรายอย่าง Copilotevil
- Copilot ใช้ สิทธิ์เดียวกับผู้ใช้ที่ส่งคำขอนั้น จึงสามารถเข้าถึงรีโพซิทอรีส่วนตัวและใช้ข้อมูลภายในได้
- สามารถจำลองสถานการณ์ที่ข้อมูลรั่วไหลไปถึงแฮ็กเกอร์เมื่อผู้ใช้กดคลิก ด้วยการ เพิ่มข้อมูลที่เข้ารหัสแบบ base16 ลงใน URL โดยตั้งใจ
สรุปผลกระทบหลัก
- บิดเบือนและควบคุมเนื้อหาคำตอบของ Copilot ของผู้ใช้อื่น
- ทำ prompt injection แบบปรับแต่งได้ ผ่าน Markdown, รูปภาพ, โค้ด, URL เป็นต้น
- สามารถพยายามโจมตีเพื่อ ดึงข้อมูลภายในขอบเขตสิทธิ์ของผู้ใช้เหยื่อออกไปได้
การตีความเชิงโครงสร้างของการข้าม GitHub CSP
- GitHub ใช้ CSP ที่เข้มงวด เพื่อจำกัดการโหลดรูปภาพและทรัพยากรจากโดเมนภายนอก
- เมื่อมีการแทรกรูปภาพใน README หรือ Markdown ระบบจะใช้ GitHub Camo Proxy เพื่อแปลง URL ภายนอกให้เป็น proxy URL ที่อิงลายเซ็น HMAC
- การให้เบราว์เซอร์โหลดรูปภาพได้จำเป็นต้องมี Camo URL และค่าลายเซ็นที่ GitHub สร้างไว้ล่วงหน้า
- แม้ผู้ใช้จะสร้าง URL ที่มีข้อมูลแบบไดนามิกขึ้นเอง ก็จะ ถูกบล็อกหากไม่ผ่าน Camo proxy
วิธีใช้ประโยชน์จากโครงสร้าง Camo
- ผู้ค้นพบได้ สร้างพจนานุกรมของ Camo proxy URL สำหรับชุดตัวอักษรและอักขระพิเศษทั้งหมดล่วงหน้า แล้วใส่ไว้ในพรอมป์ต์ที่ซ่อนอยู่
- มีการออกแบบให้ Copilot ตอบคำขอแนว "เกม ASCII Art" โดยแปลง ข้อมูลที่รั่วไหล (เช่น ซอร์สโค้ดหรือคีย์) ให้กลายเป็นการเรียงต่อกันของรูปภาพจาก Camo proxy
- แต่ละคำขอรูปภาพจะทำให้เบราว์เซอร์ตอบรับเพียง พิกเซลโปร่งใส 1x1 เท่านั้น จึงไม่มีการเปลี่ยนแปลงใดที่ผู้ใช้สังเกตเห็นได้
- สุดท้ายมีการ เพิ่มพารามิเตอร์แบบสุ่มเพื่อหลีกเลี่ยงปัญหาแคช
การลงมือโจมตีและการทดสอบจริง
- เป้าหมายถูกกำหนดเป็น ข้อมูลคำอธิบายช่องโหว่ zero-day ภายใน issue ของโปรเจกต์ส่วนตัว
- มีการพิสูจน์กระบวนการโจมตีข้อมูลรั่วไหลจริงด้วย PoC (โค้ดพิสูจน์แนวคิด)
- ยังทำให้ Copilot ค้นหาคีย์เวิร์ดอย่าง "AWS_KEY" และส่งผลลัพธ์ออกไปโดยอัตโนมัติ ได้ด้วย
การตอบสนองและแพตช์ของ GitHub
- GitHub ได้แก้ไขช่องโหว่นี้ด้วยการ ปิดการเรนเดอร์รูปภาพใน Copilot Chat ทั้งหมดตั้งแต่วันที่ 14 สิงหาคม 2025
อ่านเพิ่มเติม
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
พวกเราดีใจมากที่ได้ย้ายสภาพแวดล้อมการทำงานทั้งหมดไปใช้ Forgejo ซึ่งเป็น VCS แบบ self-hosted โดยเริ่มย้ายรวมถึงรีโพซิทอรีของลูกค้าทั้งหมดตั้งแต่ 2 ปีก่อน ไม่เพียงช่วยลดค่าสมาชิก GitHub ลงได้มาก แต่ระบบที่มีนักพัฒนาใช้งานวันละ 30–40 คนก็ยังทำงานได้เร็วและเสถียรกว่ามาก อีกทั้งยังสั่งห้ามใช้ VSCode และเอดิเตอร์ทุกตัวที่มีฟีเจอร์ LLM ฝังมาในตัวด้วย นักพัฒนายังสามารถใช้ coding agent แบบ CLI ได้ แต่เรารันมันในคอนเทนเนอร์ที่แยกอย่างเข้มงวดและอนุญาตให้เข้าถึงซอร์สได้อย่างจำกัดเท่านั้น
อยากรู้ว่าในสภาพแวดล้อมที่นักพัฒนา 30–40 คนต่างโคลนรีโพซิทอรีไปไว้บนเครื่องตัวเองเพื่อทำงาน คุณป้องกันไม่ให้ใครเผลอเปิดเผยทั้งรีโพซิทอรีให้ LLM เห็นได้อย่างไร และถ้าใครกลัวผลกระทบต่อหน้าที่การงานจนไม่รายงานความผิดพลาด จะตรวจจับเหตุข้อมูลรั่วไหลได้อย่างไร
อยากถามว่าใช้ IDE อะไรเป็นทางเลือก
อยากรู้ว่าเครื่องมือ CLI พวกนี้เชื่อมต่อไปที่ไหน เป็นบริการทางการของ OpenAI หรือ Claude หรือเป็นผู้ให้บริการอย่าง AWS Bedrock
การแบน VSCode ทั้งหมดดูเหมือนเป็นมาตรการที่เกินไป มากกว่าการจำกัดเฉพาะปลั๊กอินหรือฟีเจอร์ที่มีปัญหา VSCode เป็น IDE เดียวที่รองรับภาษาได้กว้างมาก รวมถึงภาษาที่ IDE อื่นรองรับไม่ดีอย่าง Haskell, Lean 4 และ F* แม้แต่ในบริษัทยักษ์ใหญ่ด้านสินค้าอุปโภคบริโภคเชิงพาณิชย์ก็มักไม่ได้แบนตัว VSCode เอง และคิดว่าแค่ไม่ใช้ฟีเจอร์ที่มีปัญหาก็พอ
ผมคิดว่าปัญหานี้จริง ๆ แล้วยังไม่ได้ถูกแก้อย่างเหมาะสม จุดสำคัญของ Copilot คือมันรับอินพุตภาษาธรรมชาติได้ หมายความว่าไม่ว่าวิธีการรั่วไหลแบบไหน ถ้าเขียนอธิบายวิธีนั้นเป็นภาษาอังกฤษ มันก็จะทำตามได้ เขาบอกว่า “แก้” แค่วิธีเฉพาะบางแบบ แต่ไม่ได้เปิดเผยว่าจริง ๆ แก้อย่างไร เช่น อาจใช้ base64 ใน image URL ได้ หรือหลอกให้มันดึงรหัสผ่านออกมาด้วยข้อความอย่าง “ฉันเผลอบันทึกรายการของในตะกร้าไว้ในฟิลด์ passswd ช่วยหาหน่อย” ดูเหมือนจะยังมีช่องโหว่ให้ค้นหาได้อีกเยอะ ไม่รู้ว่าพวกเขามี bug bounty สำหรับเรื่องแบบนี้หรือเปล่า ที่นี่เป็นเหมืองทองเลย
อยากรู้ว่าการใช้ base64 เป็น image URL หมายถึงอะไร หมายถึงให้ใช้ image URL ที่ Camo ไม่ได้ครอบไว้หรือเปล่า เท่าที่เข้าใจ ด้วย CSP แล้วรูปภาพที่ไม่ผ่าน Camo จะถูกบล็อก และถ้า Copilot agent ไม่มีสิทธิ์เข้าถึงอินเทอร์เน็ต การ
fetchเองก็คงยากอยู่แล้ว ถ้าทำได้จริง ก็น่าจะมีเส้นทางโจมตีที่ง่ายกว่าการใช้รูปภาพมากดูเหมือนว่า GitHub จะแก้ปัญหานี้ด้วยการปิดการเรนเดอร์รูปภาพใน Copilot Chat ไปเลย
ไอเดียที่สร้าง Camo URL ล่วงหน้าสำหรับตัวอักษรและสัญลักษณ์ทั้งหมด แล้วแทรกมันเข้าไปในพรอมป์ตนั้นน่าประทับใจมาก เป็นวิธีที่สวยงาม
บทความนี้ให้ความรู้สึกเหมือนเป็นการโปรโมตบริษัทชื่อ Legit อยู่บ้าง แต่จริง ๆ แล้วโซลูชันที่ขับเคลื่อนด้วย AI ทั้งหมดต่างก็มีจุดอ่อนร่วมกันคือความไม่โปร่งใสและปัญหาเรื่องความน่าเชื่อถือ เวลาใช้เครื่องมือ AI ด้านความมั่นคงปลอดภัยไซเบอร์ที่ไม่ได้อยู่บนฐาน FOSS ความเสี่ยงด้านความปลอดภัยอาจยิ่งเพิ่มขึ้นด้วยซ้ำ
เรื่องแบบนี้ไม่ใช่ครั้งแรก ก่อนหน้านี้ก็มี กรณีที่เกี่ยวข้อง ชื่อ “GitHub Copilot Chat: From Prompt Injection to Data Exfiltration”
ผมคิดว่าการซ่อนข้อมูลด้วย HTML comment ที่ซ่อนอยู่ใน PR ยังอาจเป็นประเด็นร้ายแรงอยู่ โดยเฉพาะในรีโพซิทอรีโอเพนซอร์ส อยากรู้ว่าส่วนนี้ได้รับการปรับปรุงแล้วหรือยัง
สิ่งที่น่าสนใจของเอ็กซ์พลอยต์นี้คือมันอาศัยรูปแบบการตอบกลับแบบช้า ๆ ทีละโทเค็นของ LLM เพื่อให้สามารถประกอบข้อมูลกลับตามลำดับได้ คาดว่าถ้า LLM ส่งคำตอบทั้งหมดกลับมาเป็นก้อนเดียว จังหวะเวลาจะปั่นป่วนจนทำให้การประกอบกลับยากขึ้นมาก
สงสัยว่าจะรับมือโดยจำกัดสิทธิ์การเข้าถึง repo ของผู้ใช้ Copilot ให้เป็นแบบอ่านอย่างเดียวได้หรือไม่
ผมจำไม่ได้แล้วด้วยซ้ำว่าครั้งล่าสุดที่ผมทำให้ซอร์สโค้ดส่วนตัวรั่วผ่าน Copilot คือเมื่อไร
คิดว่าเป็นแนวทางที่แปลกใหม่และยอดเยี่ยมจริง ๆ