ชุมชนนักพัฒนาภาษา Go กำลังถกเถียงถึงประเด็นด้านความปลอดภัยที่ซ่อนอยู่แต่มีความสำคัญ เกี่ยวกับตัวเลือกแปรผัน Unicode ในการตั้งชื่อไฟล์ โดยเฉพาะอย่างยิ่งวิธีที่มันสามารถถูกใช้เพื่อหลีกเลี่ยงระบบตรวจจับไฟล์ทดสอบของ Go
ช่องโหว่ด้านความปลอดภัย
มีการถกเถียงที่สำคัญเกี่ยวกับวิธีที่คอมไพเลอร์ของ Go จัดการกับไฟล์ที่มีอักขระ Unicode พิเศษ โดยเฉพาะในไฟล์ทดสอบ ในขณะที่ Go มักจะข้ามไฟล์ที่ลงท้ายด้วย _test.go
ในระหว่างการคอมไพล์ปกติ แต่มีช่องโหว่ที่น่ากังวลที่ทำให้ผู้โจมตีสามารถจัดการกับชื่อไฟล์โดยใช้ตัวเลือกแปรผัน Unicode เพื่อสร้างไฟล์ที่ดูเหมือนเป็นไฟล์ทดสอบ แต่จริงๆ แล้วถูกคอมไพล์เข้าไปในโปรแกรมหลัก
การป้องกันของระบบโมดูล
ตามความเห็นของ Russ Cox ระบบโมดูลของ Go มีการป้องกันบางส่วนต่อช่องโหว่นี้ ในขณะที่แพ็คเกจในเครื่องสามารถสร้างและบิลด์ด้วยตัวเลือกแปรผัน Unicode (เช่น U+FE0E) ในชื่อไฟล์ได้ แต่ระบบโมดูลจะป้องกันการสร้างหรือดาวน์โหลดโมดูลที่มีอักขระดังกล่าว ซึ่งหมายความว่าช่องทางการโจมตีจะจำกัดอยู่เฉพาะที่ repository ระดับบนสุดและไม่สามารถส่งผลกระทบต่อ dependencies ได้
ช่องโหว่สถานะส่วนกลาง
การอภิปรายยังได้เน้นย้ำถึงความกังวลด้านความปลอดภัยที่กว้างขึ้นในสถาปัตยกรรมของ Go แพ็คเกจที่มีสถานะส่วนกลางซึ่งมีความสำคัญต่อความปลอดภัยและสามารถเปลี่ยนแปลงได้จากทั่วโลกถือเป็นช่องโหว่ที่สำคัญ ตัวอย่างที่เห็นได้ชัดคือ (crypto/rand).Reader
ในไลบรารีมาตรฐาน ซึ่งสามารถถูกเขียนทับด้วยค่า io.Reader
ใดๆ ได้ แม้ว่าปัญหานี้จะถูกหยิบยกมาพูดคุยใน GitHub แต่ผู้ดูแลภาษาเลือกที่จะไม่แก้ไขโดยตรง โดยให้เหตุผลว่าการเปลี่ยนแปลงดังกล่าวอาจให้ภาพลวงตาของความปลอดภัยเท่านั้น
ผลกระทบและการบรรเทา
ผลกระทบด้านความปลอดภัยของช่องโหว่นี้มีความน่ากังวลเป็นพิเศษเพราะ:
- เครื่องมือพัฒนาส่วนใหญ่ (รวมถึง Vim, VSCode และแพลตฟอร์มโฮสติ้งโค้ดหลัก) ไม่ได้แสดงการมีอยู่ของอักขระพิเศษเหล่านี้อย่างชัดเจน
- การตรวจสอบโค้ดอาจมองข้ามการจัดการที่แยบยลเหล่านี้
- โค้ดที่เป็นอันตรายสามารถปรากฏเหมือนโค้ดทดสอบที่ถูกต้อง ในขณะที่ถูกคอมไพล์เข้าไปในโปรแกรมหลัก
แม้ว่าระบบโมดูลของ Go จะมีการป้องกันบางส่วน องค์กรต่างๆ ควรพิจารณาการนำแนวปฏิบัติในการตรวจสอบโค้ดและเครื่องมือเพิ่มเติมที่สามารถตรวจจับตัวเลือกแปรผัน Unicode ในชื่อไฟล์ โดยเฉพาะสำหรับโค้ดใน repository ระดับบนสุด
สถานะปัจจุบัน
แม้จะมีการรายงานไปยังแพลตฟอร์มโฮสติ้งโค้ดหลักอย่าง GitHub, GitLab และ BitBucket แต่ไม่มีแพลตฟอร์มใดจัดให้เรื่องนี้เป็นปัญหาด้านความปลอดภัย ทีมความปลอดภัยของ Go ( [email protected] ) ก็ยังไม่ได้ตอบสนองต่อรายงานเกี่ยวกับช่องโหว่นี้ ซึ่งบ่งชี้ว่าชุมชนอาจจำเป็นต้องดำเนินการเพิ่มเติมเพื่อจัดการกับความกังวลด้านความปลอดภัยนี้