เจาะลึกบั๊กข้อมูลว่างในเครื่องมือสแกนโครงสร้างคลาวด์
บทเรียนจากการแก้ไขบั๊กในระบบ Infrawise เมื่อผลลัพธ์ว่างเปล่าไม่ได้แปลว่าปลอดภัยเสมอไป

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- สแกนเนอร์โครงสร้างระบบคลาวด์มักใช้ฟิลด์บูลีนสองสถานะเพื่อสื่อสารสามสถานะ
- การถูกปฏิเสธสิทธิ์ S3 ทำให้เครื่องมือพิมพ์ค่าเริ่มต้นเป็นเท็จโดยไม่ได้อ่านจาก AWS
- ระบบ AI โค้ดดิ้งแอสซิสแตนต์ตีความผลลัพธ์ที่ว่างเปล่าว่าปลอดภัยจริงจนเกิดความเสี่ยง
- แนวทางแก้ปัญหาคือการเพิ่มสถานะ null และระบุบล็อก dataHealth อย่างชัดเจน
การตรวจสอบโครงสร้างพื้นฐานไอทีในระบบคลาวด์มักจบลงด้วยการปิดตั๋วงานเมื่อพบและแก้ไขปัญหาทั้งหมดแล้ว แต่ในความเป็นจริง รายงานการสแกนอาจไม่ได้บอกความจริงทั้งหมด เช่น บทเรียนจากการทำงานในระบบ Infrawise ที่พบว่าสิทธิ์การใช้งานบทบาทขาดคำสั่ง s3:GetEncryptionConfiguration ทำให้ถังจัดเก็บข้อมูล S3 จำนวน 14 ถังส่งค่ากลับมาว่าปฏิเสธการเข้าถึง (AccessDenied)
เครื่องมือสแกนจับข้อผิดพลาดดังกล่าว เขียนค่า encrypted เป็น false แล้วข้ามไปถังถัดไปทันที ทำให้ไม่สามารถแยกแยะได้ว่าถังใดเข้ารหัสแล้วหรือยังไม่ได้เข้ารหัส เนื่องจากค่าที่แสดงไม่ได้อ่านจากระบบ AWS จริง แต่เป็นค่าเริ่มต้นที่ถูกกำหนดขึ้นเมื่อการอ่านข้อมูลล้มเหลว

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
ปัญหานี้ไม่ใช่บั๊กของ S3 โดยตรง แต่เป็นบั๊กรูปทรงของข้อมูลที่เครื่องมือสแกนโครงสร้างส่วนใหญ่เผชิญ นั่นคือการใช้ฟิลด์บูลีนที่มีสองสถานะเพื่อแบกรับข้อมูลสามสถานะ โดยระบบ S3 extractor จะทำการเรียก API สี่คำสั่งต่อหนึ่งถังผ่าน Promise.allSettled เพื่อป้องกันไม่ให้ข้อผิดพลาดจุดเดียวทำให้ส่วนอื่นล่ม แต่ผลลัพธ์ที่ได้กลับทำให้ตัววิเคราะห์ปลายทางได้รับค่า versioned: false และแนะนำให้เปิดใช้งานเวอร์ชันสำหรับถังที่ระบบไม่เคยอ่านค่าสถานะเลยแม้แต่น้อย
แนวทางการแก้ไขปัญหาในโค้ดทำได้โดยการเพิ่มสถานะที่สามเข้าไป:
const versioned = versionResult.status === 'fulfilled' ? versionResult.value.Status === 'Enabled' : null;และตัววิเคราะห์ทุกตัวจะตรวจสอบจากการสังเกต ไม่ใช่การตรวจสอบความเท็จ:
if (node.versioned === false) { /* finding */ }ค่า null จะไหลผ่านไปโดยไม่มีการแจ้งเตือน เพราะไม่มีสิ่งใดให้ค้นหานอกจากสิ่งที่ยังไม่ได้อ่าน
การจัดการข้อผิดพลาดในลักษณะนี้ไม่สามารถใช้ตัวห่อหุ้มแบบครอบจักรวาลอย่างการดักจับทุกอย่างแล้วคืนค่า null ได้ เนื่องจากข้อยกเว้นบางประเภทเช่น GetBucketEncryption หรือ GetPublicAccessBlock มีความหมายในตัวของมันเอง การละเลยรายละเอียดของชื่อข้อผิดพลาดจะทำให้พลาดการรายงานถังที่ไม่ได้เข้ารหัสจริง ๆ
รูปแบบปัญหาลักษณะนี้ยังปรากฏในจุดอื่น ๆ ของระบบที่ต้องเชื่อมต่อกับ API ที่ควบคุมไม่ได้ เช่น รายการที่ถูกจำกัดหน้า (ListBuckets) การสร้างโหนดจำลองเมื่อไม่มีชื่อคิว และบริการที่ล้มเหลวบางส่วน ซึ่งการโยนทิ้งบริการทั้งหมดมีต้นทุนสูงเกินไป การออกแบบระบบจึงต้องมีการส่งสถานะสี่ระดับ ได้แก่ ok, failed, partial และ disabled ไปพร้อมกับผลลัพธ์เสมอ
ปัญหาดังกล่าวอาจดูเป็นเรื่องเล็กน้อยสำหรับมนุษย์ที่ใช้เวลาไม่นานในการตรวจสอบคอนโซลและกดข้ามไป แต่เมื่อผู้ใช้งานเปลี่ยนเป็น AI โค้ดดิ้งแอสซิสแตนต์ผ่าน MCP สถานการณ์จะเปลี่ยนไปอย่างสิ้นเชิง AI จะไม่ตั้งข้อสงสัยเมื่อได้ชุดข้อมูล JSON ว่างเปล่า แต่มันจะสรุปทันทีว่าทุกอย่างปลอดภัยร้อยเปอร์เซ็นต์และเขียนนโยบายความปลอดภัยตามสมมติฐานนั้นทันที
แนวทางป้องกันในปัจจุบันจึงกำหนดให้ทุกการตอบสนองของเครื่องมือต้องพ่วงบล็อก dataHealth ที่มีรายการแหล่งที่มาพร้อมสถานะและข้อผิดพลาดที่ชัดเจน เพื่อให้ระบบ AI สามารถแยกแยะข้อมูลจากแหล่งที่มาที่ใช้งานได้ปกติและแหล่งที่มาที่มีปัญหาออกจากกันอย่างเด็ดขาด
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น