แคมเปญโจมตีที่ซับซ้อนเพิ่งเข้าโจมตี GitHub Actions workflows เพื่อขโมย PyPI publishing tokens ซึ่งเป็นการเน้นย้ำถึงปัญหาด้านความปลอดภัยที่ร้ายแรงเกี่ยวกับวิธีที่นักพัฒนาจัดการข้อมูลลับในระบบ continuous integration แม้ว่าผู้โจมตีจะไม่ได้เผยแพร่แพ็กเกจ PyPI จริงๆ แต่เหตุการณ์นี้ได้เปิดเผยช่องโหว่ในวิธีที่โปรเจ็กต์หลายๆ โปรเจ็กต์จัดการข้อมูลประจำตัวสำหรับการเผยแพร่
การโจมตีเริ่มต้นเมื่อวันที่ 5 กันยายน เมื่อนักวิจัยจาก GitGuardian ค้นพบโค้ดที่เป็นอันตรายถูกแทรกเข้าไปใน GitHub Actions workflows โค้ดที่ถูกแก้ไขเหล่านี้ถูกออกแบบมาเพื่อส่ง PyPI tokens ที่เก็บไว้เป็น GitHub secrets ไปยังเซิร์ฟเวอร์ภายนอกที่ควบคุมโดยผู้โจมตี แคมเปญนี้ส่งผลกระทบต่อ repositories จำนวนมากทั่วทั้งแพลตฟอร์ม ซึ่งแสดงให้เห็นถึงลักษณะที่แพร่หลายของภัยคุกคามด้านความปลอดภัยนี้
ไทม์ไลน์การโจมตี
- 5 กันยายน: การค้นพบครั้งแรกโดย GitGuardian ของเวิร์กโฟลว์ที่เป็นอันตรายในโปรเจกต์ fastuuid
- 5 กันยายน: รายงานผลการค้นพบเพิ่มเติมผ่านอีเมล (ล่าช้าเนื่องจากการกรองสแปม)
- 10 กันยายน: ทีมรักษาความปลอดภัย PyPI ทราบเรื่องผ่านช่องทางอื่น
- 15 กันยายน: แจ้งเตือนผู้ดูแลโปรเจกต์ที่ได้รับผลกระทบและยกเลิกโทเค็น
ปัญหาพื้นฐานของระบบ CI ของบุคคลที่สาม
เหตุการณ์นี้ได้จุดประกายการอภิปรายอย่างเข้มข้นเกี่ยวกับความเสี่ยงที่มีอยู่โดยธรรมชาติของการใช้ระบบ continuous integration ของบุคคลที่สามสำหรับการดำเนินงานที่มีความละเอียดอ่อน สมาชิกในชุมชนกำลังตั้งคำถามถึงความชาญฉลาดในการมอบหมายให้ GitHub Actions ดูแล API secrets ในขณะเดียวกันก็อนุญาตให้มันรันโค้ดจากบุคคลที่สามอื่นๆ
โมเดลความปลอดภัยกลายเป็นเรื่องที่น่ากังวลมากขึ้นเมื่อพิจารณาว่า GitHub Actions สนับสนุนให้นักพัฒนานำเข้าโค้ดของบุคคลที่สามแบบสุ่มเข้าสู่ workflows ของพวกเขาโดยใช้ tags ที่เปลี่ยนแปลงได้ ซึ่งหมายความว่า action ที่ดูปลอดภัยในวันนี้อาจกลายเป็นอันตรายในอนาคตหาก repository ต้นฉบับถูกบุกรุกหรือถูกโอนให้กับผู้ประสงค์ร้าย
ระบบ CI เองสนับสนุนให้คุณนำเข้าโค้ดของบุคคลที่สามแบบสุ่มเข้าสู่ CI workflow ของคุณ โดยอิงจาก mutable tags ซึ่งจากนั้นจะได้รับสิทธิ์เต็มรูปแบบ - ทั้งหมดนี้เป็นเรื่องบ้าคลั่ง
แม้ว่านักพัฒนาสามารถกำหนด commit hashes เฉพาะแทนการใช้ tags แต่แนวปฏิบัตินี้ไม่ใช่พฤติกรรมเริ่มต้นและสร้างภาระการบำรุงรักษาเพิ่มเติมที่หลายทีมหลีกเลี่ยง
ข้อได้เปรียบของ Python ในด้านความปลอดภัยของแพ็กเกจ
การอภิปรายยังได้เน้นย้ำถึงความแตกต่างที่น่าสนใจระหว่าง Python และ JavaScript ecosystems การสังเกตของชุมชนชี้ให้เห็นว่า Python เผชิญกับการโจมตีที่เกี่ยวข้องกับแพ็กเกจน้อยกว่าเมื่อเปรียบเทียบกับ npm แม้ว่า Python จะมีความนิยมเพิ่มขึ้น ความแตกต่างนี้ดูเหมือนจะเกิดจาก standard library ที่ครอบคลุมของ Python ซึ่งลดความจำเป็นในการใช้ dependencies ภายนอก
แอปพลิเคชัน Flask ทั่วไปอาจต้องการเพียง 15 รายการในไฟล์ requirements ในขณะที่โปรเจ็กต์ JavaScript ที่เทียบเท่ามักจะดึง transitive dependencies หลายร้อยรายการ แพ็กเกจ Python หลักๆ เช่น NumPy มี Python dependencies น้อยมาก โดยอาศัย system libraries ที่มีชื่อเสียงแทนที่จะเป็นเครือข่ายที่ซับซ้อนของแพ็กเกจบุคคลที่สาม
โซลูชัน Trusted Publishers
เหตุการณ์นี้เสริมความสำคัญของฟีเจอร์ Trusted Publishers ของ GitHub ในฐานะการป้องกันการขโมย token ต่างจาก API tokens ระยะยาวที่เก็บไว้เป็นข้อมูลลับ Trusted Publishers ใช้ tokens ระยะสั้นที่สร้างขึ้นโดยอัตโนมัติสำหรับ repositories เฉพาะและหมดอายุอย่างรวดเร็ว
แม้ว่าผู้โจมตีจะสามารถแก้ไข workflows ที่ใช้ Trusted Publishers ได้ tokens ที่ถูกขโมยก็มีอายุการใช้งานและขอบเขตที่จำกัด สิ่งนี้ลดช่วงเวลาของโอกาสสำหรับกิจกรรมที่เป็นอันตรายอย่างมีนัยสำคัญและจำกัดความเสียหายที่อาจเกิดขึ้นจากการโจมตีที่ประสบความสำเร็จ
มาตรการรักษาความปลอดภัยที่แนะนำ
- เปลี่ยนจาก token ระยะยาวไปใช้ Trusted Publishers สำหรับ GitHub Actions
- ตรวจสอบประวัติความปลอดภัยของบัญชีอย่างสม่ำเสมอใน PyPI Account Settings
- กำหนด GitHub Actions ให้ใช้ commit SHA เฉพาะเจาะจงแทนการใช้ tag ที่เปลี่ยนแปลงได้
- ลดการพึ่งพา external dependencies ให้น้อยที่สุดเท่าที่เป็นไปได้
- ติดตาม repository เพื่อตรวจสอบการแก้ไข workflow ที่ไม่ได้รับอนุญาต
การตอบสนองและการกู้คืนอย่างรวดเร็ว
ทีมความปลอดภัยของ PyPI ตอบสนองอย่างมีประสิทธิภาพเมื่อพวกเขาทราบเกี่ยวกับแคมเปญนี้ tokens ที่ได้รับผลกระทบทั้งหมดถูกยกเลิก และผู้ดูแลโปรเจ็กต์ได้รับการแจ้งเตือนโดยตรงเกี่ยวกับการบุกรุก นักพัฒนาหลายคนได้หมุนเวียนข้อมูลประจำตัวของพวกเขาเชิงรุกและลบ workflows ที่เป็นอันตรายออกจากประวัติ repository ของพวกเขา
เหตุการณ์นี้เป็นสัญญาณเตือนสำหรับชุมชนนักพัฒนาเกี่ยวกับผลกระทบด้านความปลอดภัยของแนวปฏิบัติ CI/CD สมัยใหม่ เมื่อระบบอัตโนมัติกลายเป็นศูนย์กลางของการพัฒนาซอฟต์แวร์มากขึ้น ความจำเป็นในการมีมาตรการความปลอดภัยที่แข็งแกร่งและการพิจารณาความสัมพันธ์ของความไว้วางใจอย่างรอบคอบกลายเป็นสิ่งสำคัญมากกว่าที่เคย
อ้างอิง: Token Exfiltration Campaign via GitHub Actions Workflows