- AWS เปิดตัว ฟีเจอร์ปกป้องเนมสเปซแบบอิงบัญชี ใหม่เพื่อแก้ปัญหา S3 bucketsquatting
- เนมสเปซใหม่นี้มีรูปแบบเป็น
<prefix>-<accountid>-<region>-an โดยมีเพียงบัญชีเดียวกันเท่านั้นที่สามารถสร้างบัคเก็ตชื่อนี้ได้
- หากบัญชีอื่นพยายามใช้ชื่อเดียวกัน จะเกิดข้อผิดพลาด
InvalidBucketNamespace และหากระบุรีจินไม่ถูกต้องก็จะได้ข้อผิดพลาดเดียวกัน
- แนะนำให้ใช้เนมสเปซนี้ เป็นค่าเริ่มต้น และสามารถบังคับใช้ได้ผ่านนโยบายระดับองค์กร (SCP) ด้วยคีย์เงื่อนไข
s3:x-amz-bucket-namespace
- แม้จะไม่สามารถใช้ย้อนหลังกับบัคเก็ตเดิมได้ แต่ก็ให้การปกป้องที่แข็งแกร่งกับบัคเก็ตใหม่ และถือเป็น การปรับปรุงพื้นฐานด้านความปลอดภัยของ S3
ภาพรวมของปัญหา Bucketsquatting
- Bucketsquatting (หรือ Bucketsniping) เป็นรูปแบบการโจมตีใน AWS S3 ที่อาศัยข้อเท็จจริงว่าชื่อบัคเก็ตต้องไม่ซ้ำกันทั้งระบบทั่วโลก
- เมื่อบัคเก็ตถูกลบ ชื่อนั้นจะกลับมาใช้งานได้อีก ทำให้ผู้โจมตีสามารถลงทะเบียนบัคเก็ตใหม่ด้วยชื่อเดิมได้
- ส่งผลให้เกิดความเสี่ยงต่อการเข้าถึงข้อมูลสำคัญหรือการหยุดชะงักของบริการ
- องค์กรมักใช้ กฎการตั้งชื่อที่คาดเดาได้ เช่น
myapp-us-east-1 ทำให้มีโอกาสถูกโจมตีสูง
- แม้แต่ทีมภายใน AWS เองก็ได้รับผลกระทบจากปัญหานี้ และได้ร่วมมือกับทีมความปลอดภัยของ AWS มาราว 10 ปีเพื่อหาวิธีแก้ไข
การเปิดตัวเนมสเปซ S3 แบบใหม่
- AWS ได้นำแนวคิด เนมสเปซรายบัญชี (account namespace) มาใช้เพื่อแก้ปัญหา
- รูปแบบ:
<prefix>-<accountid>-<region>-an
- ตัวอย่าง:
myapp-123456789012-us-west-2-an
- เนมสเปซนี้จำกัดให้มีเพียงบัญชีนั้นเท่านั้นที่สามารถสร้างบัคเก็ตด้วยชื่อนี้ได้
- หากบัญชีอื่นสร้างชื่อเดียวกัน จะเกิดข้อผิดพลาด
InvalidBucketNamespace
- หากรีจันในชื่อบัคเก็ตไม่ตรงกับรีจันจริง ก็จะได้ข้อผิดพลาดเดียวกัน
- AWS แนะนำอย่างยิ่งให้ใช้เนมสเปซนี้ กับบัคเก็ตใหม่ทั้งหมดเป็นค่าเริ่มต้น
- ต่างจากเนมสเปซเดิม (
.mrap, --x-s3, -s3alias) เพราะครั้งนี้ถูกออกแบบมาเป็น เนมสเปซสำหรับผู้ใช้ทั่วไปเพื่อวัตถุประสงค์ด้านความปลอดภัย
การบังคับใช้นโยบายและการจัดการ
- ผู้ดูแลความปลอดภัยสามารถใช้คีย์เงื่อนไข
s3:x-amz-bucket-namespace เพื่อบังคับใช้การใช้เนมสเปซผ่าน นโยบายระดับองค์กร (SCP) ได้
- จะไม่ถูกนำไปใช้โดยอัตโนมัติกับบัคเก็ตเดิมหรือเทมเพลตที่ไม่มีเนมสเปซ
- หากต้องการปกป้องบัคเก็ตเดิม จำเป็นต้องสร้างบัคเก็ตใหม่ตามรูปแบบเนมสเปซใหม่นี้และย้ายข้อมูลไป
- มาตรการนี้ทำให้ bucketsquatting แทบจะ “หายไป” แล้ว และมอบการปกป้องแบบสมบูรณ์ให้กับบัคเก็ตใหม่
แนวทางของผู้ให้บริการคลาวด์รายอื่น
- Google Cloud Storage (GCS) ใช้ เนมสเปซแบบตรวจสอบชื่อโดเมน อยู่แล้ว
- บัคเก็ตที่ใช้รูปแบบโดเมนอย่าง
myapp.com สามารถสร้างได้โดยเจ้าของโดเมนเท่านั้น
- แต่บัคเก็ตที่ไม่ใช่รูปแบบโดเมนก็ยังมีโอกาสเกิด bucketsquatting ได้
- Azure Blob Storage ใช้โครงสร้างแบบ ชื่อบัญชีสตอเรจ + ชื่อคอนเทนเนอร์
- ด้วยข้อจำกัดความยาวสูงสุด 24 ตัวอักษร ทำให้เนมสเปซแคบกว่า และอาจเสี่ยงต่อปัญหาเดียวกันมากกว่า
บทสรุป (tl;dr)
- AWS S3 เปิดตัว เนมสเปซบัญชี-รีจันแบบใหม่
- เนมสเปซนี้ช่วย ป้องกันการโจมตีแบบ bucketsquatting และแนะนำให้ใช้อย่างยิ่งเมื่อสร้างบัคเก็ตใหม่
- บัคเก็ตเดิมจะไม่ได้รับการปกป้องโดยอัตโนมัติ ดังนั้นหากจำเป็นควรเสริมการป้องกันด้วย การย้ายข้อมูล
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เมื่อไม่นานมานี้เพิ่งรู้ว่า ไม่สามารถนำอีเมลของผู้ใช้ root กลับมาใช้ซ้ำได้ แม้จะลบบัญชี AWS ไปแล้วก็ตาม
มีคนในองค์กรของเราสร้างผู้ใช้ root ของบัญชีที่ปิดไปแล้วด้วยอีเมลหลักของบริษัท จากนั้นก็สร้างบัญชีใหม่ด้วยอีเมลอื่น ซึ่งตอนนี้เลยช่วงเวลากู้คืนหลังการลบไปแล้ว
ผลคืออีเมลนั้นถูกผูกกับบัญชี root ที่ถูกลบอย่างถาวร ทำให้ ไม่สามารถล็อกอินแบบ SSO ผ่าน IdP ภายนอกได้อีก
ติดต่อทีมซัพพอร์ต AWS แล้ว แต่แทบไม่ได้รับความช่วยเหลือ
รหัสผ่านมีการบันทึกไว้ในเอกสาร แต่ไม่มีทางปิด MFA ได้ จึงติดต่อทั้ง AWS support และผู้ดูแลบัญชีแล้วก็ยังแก้ไม่ได้
สุดท้ายเลยยังเข้าใช้บัญชี root ไม่ได้ และอาจต้องย้ายสภาพแวดล้อมที่ซับซ้อนทั้งหมดไปยังบัญชีใหม่
AWS มองว่าอีเมลที่มีเครื่องหมายบวกเป็นคนละที่อยู่อีเมลกัน
ควรใช้เฉพาะเวลาที่เกิดปัญหาร้ายแรงจริง ๆ เท่านั้น
สุดท้ายถ้ามีมิจฉาชีพคนไหนหลอกทีมซัพพอร์ตลูกค้าจนได้ คะแนนประเมิน 10/10 ทุกอย่างก็อาจพังได้หมด
อยากรู้ว่ากลไกไหนที่ทำให้ใช้งานไม่ได้จริง
ดูเหมือนผู้เขียนจะเข้าใจแนวคิด account name ของ Azure Blob Storage ผิด
จริง ๆ แล้วมันอยู่ในระดับเดียวกับชื่อบัคเก็ตของ S3 และต้องไม่ซ้ำกันทั่วโลก จึงยังเป็นความยุ่งยากใหญ่เหมือนเดิม
โดยเฉพาะที่จำกัดความยาวชื่อไว้ 24 ตัวอักษรยิ่งน่าอึดอัด
อยากให้ Microsoft เพิ่ม namespace แยกตามลูกค้า แบบเดียวกับ AWS
แต่เปลี่ยนไม่ได้เพราะข้อจำกัดจากการออกแบบยุคแรก
ส่วนตัวไม่เข้าใจว่าทำไมถึงยังไม่ทำ S3 v2 API
ถ้ามี API ใหม่ก็น่าจะค่อย ๆ ย้ายระบบได้ แต่สุดท้ายทั้งลูกค้าและวิศวกรกลับต้องทนกับความเจ็บปวดที่ไม่จำเป็น
ทำให้ใช้ได้แค่ตัวเลขกับตัวพิมพ์เล็ก ซึ่งลำบากมาก
อยากให้อนุญาตอย่างน้อยเครื่องหมายขีดแบบ S3 หรือ GCS
ทรัพยากรอื่นอย่าง container registry ก็เป็นแบบเดียวกัน
ชื่อแพ็กเกจ ชื่อบัคเก็ต ชื่อบัญชี GitHub ฯลฯ อาจใช้รูปแบบแบบ Discord คือ @ชื่อ-สุ่ม4หลัก ก็น่าจะดี
แบบนี้จะทำให้พื้นที่ชื่อเป็นประชาธิปไตยขึ้น และป้องกัน การสควอตหรือการโจมตีจากการนำชื่อกลับมาใช้ซ้ำ ได้
ถ้าบัญชีถูกลบ ก็ทิ้งชื่อเต็มนั้นไปเลยได้อย่างเรียบร้อย
เหตุผลมีอธิบายไว้ในประกาศอย่างเป็นทางการ ว่า
ผู้ใช้ลำบากเพราะต้องจำเลข 4 หลัก และยังต้องแยกพิมพ์เล็กพิมพ์ใหญ่อีก
โดยเฉพาะในแอปแชต ควรใช้ ID ภายใน ส่วนผู้ใช้ก็ใช้แค่นามแฝง จะดูสะอาดกว่า
สำหรับบัคเก็ตนั้น ชื่อที่คนอ่านเข้าใจง่ายสำคัญกว่า จึงมองว่าการใช้ โดเมนของตัวเอง น่าจะดีกว่า
กลับยิ่งเพิ่ม ความเสี่ยงจากการพิมพ์ผิด เสียมากกว่า
ในชุมชนออนไลน์ การมีชื่อซ้ำกันเป็นเรื่องธรรมดาอยู่แล้ว
เลยสงสัยว่าทำไมต้องบังคับให้ชื่อไม่ซ้ำกันทั่วโลกด้วย
ขอบคุณ Ian Mckay ผู้เขียน
ที่ AWS เพิ่ม namespace ระดับบัญชีและรีเจียน อย่างเป็นทางการถือเป็นการเปลี่ยนแปลงที่ดี
ถ้าเครื่องมือ IaC อย่าง Terraform นำกฎนี้ไปใช้เป็นค่าเริ่มต้นด้วยจะยิ่งดี
ตอนนี้ Terraform ก็ใส่ suffix แฮชแบบสุ่ม ท้ายชื่อบัคเก็ตเพื่อเลี่ยงการชนกันอยู่แล้ว
มีรายละเอียดใน บล็อกทางการของ AWS เช่นกัน
การโจมตีแบบ bucket squatting ที่เกิดเมื่อผู้ให้บริการคลาวด์ใช้ ชื่อบัคเก็ตที่คาดเดาได้ เป็นพื้นที่ scratch ภายใน เป็นเรื่องที่น่าสนใจ
ใน AWS การโจมตีจริงทำได้ยากเพราะมีแฮช แต่ GCP เพิ่งเจอปัญหาแบบนี้ไม่นานมานี้
ดูเพิ่มเติมได้จาก: DC32 AWS bucket squatting talk,
ช่องโหว่ GCP: CVE-2026-1727
พอเห็นว่าชื่อบัคเก็ตคาดเดาได้ก็รู้สึกถึงความเสี่ยงทันที
ถ้าเป็นการผสมกันของ bucket squatting + public bucket + ปัญหา TOCTOU ของ CloudFormation
ก็อาจเพียงพอที่จะ deploy ทรัพยากรเข้าไปในบัญชีของคนอื่นได้เลย
น่าแปลกใจที่ทีมความปลอดภัยของ AWS ไม่เจอเรื่องนี้เร็วกว่านี้
ชื่อ DNS ก็มีปัญหาคล้ายกัน
ถ้าไม่ต่ออายุโดเมน ก็จะมีคนมาจดทะเบียนใหม่ได้
และใครสักคนอาจตั้งค่า MX record เพื่อ ดักอีเมลรีเซ็ตรหัสผ่าน เป็นต้น
บัคเก็ตของ AWS ยังให้ฟีเจอร์พิเศษเฉพาะกรณีที่ ชื่อเหมือนกับ hostname เท่านั้น
เอกสารที่เกี่ยวข้อง: Virtual Hosting in S3
ชื่อไม่ควรเป็นสิ่งเดียวกับวัตถุที่มันอ้างถึง
เมื่อมีการนำชื่อกลับมาใช้ใหม่ มันก็จะชี้ไปยังสิ่งที่ต่างออกไปโดยสิ้นเชิง
และความหมายของมันขึ้นอยู่กับบริบท
จะถือว่าเป็นสิ่งเดียวกันได้ก็ต่อเมื่อเราเป็นผู้กำหนดชื่อนั้นใหม่ด้วยตัวเองเท่านั้น
เคยสงสัยว่าการเปิดเผย account ID จะเสี่ยงด้านความปลอดภัยหรือไม่
ตามเอกสารทางการ
ควรจัดการอย่างระมัดระวัง แต่ไม่ถือเป็นข้อมูลอ่อนไหว
ถ้าไม่ได้เปิดเผยพร่ำเพรื่อเกินไปก็ไม่น่ามีปัญหา
เพราะในกฎ IAM ฝั่งผู้โจมตีใช้ * ได้อยู่แล้ว ดังนั้นสิ่งสำคัญจริง ๆ คือการตั้งค่านโยบายของฝั่งป้องกัน
และถอด base32 แล้วจะ ดึง Account ID ออกมาได้
อ้างอิง: บทวิเคราะห์ที่เกี่ยวข้อง
การที่ S3 ใช้ ชื่อบัคเก็ตเพียงอย่างเดียวเป็น access key ถือเป็นหนึ่งในการตัดสินใจด้านการออกแบบที่น่าหงุดหงิดที่สุด