กลับไปหน้าบทความ

อ่าน 3 นาที

การโจมตีด้วยเสียงหัวเราะนับพันล้าน

ในด้าน ความปลอดภัยทางคอมพิวเตอร์ การโจมตี แบบ Billion Laughs เป็นการ โจมตีแบบปฏิเสธการให้บริการ (DoS attack) ประเภทหนึ่งซึ่งมุ่งเป้าไปที่ ตัวแยก วิเคราะห์เอกสาร XML [ 1 ]

การโจมตีด้วยเสียงหัวเราะนับพันล้าน

ในด้านความปลอดภัยทางคอมพิวเตอร์ การโจมตี แบบBillion Laughs เป็นการ โจมตีแบบปฏิเสธการให้บริการ (DoS attack) ประเภทหนึ่งซึ่งมุ่งเป้าไปที่ตัวแยกวิเคราะห์เอกสารXML [ 1 ]

นอกจากนี้ยังเรียกอีกอย่างว่าระเบิด XMLหรือการโจมตีขยายเอนทิตีแบบทวีคูณ[ 2 ]

รายละเอียด

ตัวอย่างการโจมตีประกอบด้วยการกำหนดเอนทิตี 10 รายการ โดยแต่ละรายการประกอบด้วยเอนทิตีรายการก่อนหน้า 10 รายการ และเอกสารประกอบด้วยอินสแตนซ์เดียวของเอนทิตีที่ใหญ่ที่สุด ซึ่งจะขยายออกไปเป็นหนึ่งพันล้านสำเนาของเอนทิตีแรก นอกจากนี้ยังมีเวอร์ชันที่มีจำนวนรายการมากกว่านี้ด้วย

ในตัวอย่างที่ถูกยกมาบ่อยที่สุด เอนทิตีแรกคือสตริง " lol " ดังนั้นจึงได้ชื่อว่า "billion laughs" (เสียงหัวเราะนับพันล้านครั้ง) ในขณะที่ช่องโหว่นี้ถูกรายงานครั้งแรกหน่วยความจำคอมพิวเตอร์ที่ใช้โดยสตริง "lol" นับพันล้านครั้งนั้น อาจเกินหน่วยความจำที่มีอยู่สำหรับกระบวนการที่ประมวลผล XML

แม้ว่ารูปแบบการโจมตีดั้งเดิมจะมุ่งเป้าไปที่ตัวแยกวิเคราะห์ XML โดยเฉพาะ แต่คำนี้อาจใช้ได้กับหัวข้อที่คล้ายคลึงกันด้วยเช่นกัน[ 1 ]

ปัญหาดังกล่าวได้รับการรายงานครั้งแรกเมื่อปี พ.ศ. 2545 [ 3 ]แต่เริ่มมีการกล่าวถึงอย่างกว้างขวางในปี พ.ศ. 2551 [ 4 ]

มาตรการป้องกันการโจมตีประเภทนี้ ได้แก่ การจำกัดหน่วยความจำที่จัดสรรให้กับตัวแยกวิเคราะห์แต่ละตัว หากยอมรับได้หากเอกสารสูญหาย หรือการจัดการเอนทิตีในเชิงสัญลักษณ์ และขยายเอนทิตีเหล่านั้นแบบค่อยเป็นค่อยไปเฉพาะเมื่อ (และในขอบเขต) ที่จำเป็นต้องใช้เนื้อหาเท่านั้น

ตัวอย่างโค้ด

< ? xml version= "1.0" ? > <!DOCTYPE lolz [ <!ELEMENT lolz ( #PCDATA ) > <!ENTITY lol1 "lollollollollollollollollollol" > <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;" > <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;" > <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;" < !ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;" > <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;" > <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;" > <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;" > <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;" > ]> <lolz > &lol9; </lolz>

เมื่อตัวแยกวิเคราะห์ XML โหลดเอกสารนี้ มันจะเห็นว่าเอกสารนี้มีองค์ประกอบรากหนึ่งรายการคือ "lolz" ซึ่งมีข้อความ "&lol9;" อย่างไรก็ตาม "&lol9;" เป็นเอนทิตีที่กำหนดไว้ซึ่งขยายเป็นสตริงที่มีสตริง "&lol8;" สิบสตริง แต่ละสตริง "&lol8;" เป็นเอนทิตีที่กำหนดไว้ซึ่งขยายเป็นสตริง "&lol7;" สิบสตริง และเป็นเช่นนี้เรื่อยไป หลังจากประมวลผลการขยายเอนทิตีทั้งหมดแล้ว บล็อก XML ขนาดเล็ก (< 1 KB) นี้จะมี "lol" อยู่จริง ๆ 10⁹ = หนึ่งพันล้านตัว ซึ่งใช้ หน่วยความจำเกือบ 3 กิกะไบต์[ 2 ]

การเปลี่ยนแปลง

การโจมตีด้วยเสียงหัวเราะพันล้านครั้งที่อธิบายไว้ข้างต้นอาจใช้พื้นที่หรือเวลาในปริมาณมหาศาล การเปลี่ยนแปลง การระเบิดแบบกำลังสองทำให้ ความต้องการทรัพยากร เพิ่มขึ้นแบบกำลังสองโดยการทำซ้ำเอนทิตีขนาดใหญ่ซ้ำแล้วซ้ำเล่า เพื่อหลีกเลี่ยงมาตรการตอบโต้ที่ตรวจจับเอนทิตีที่มีการซ้อนกันอย่างมาก[ 5 ] (ดูทฤษฎีความซับซ้อนของการคำนวณสำหรับการเปรียบเทียบคลาสการเติบโตที่แตกต่างกัน)

การโจมตีแบบ "หัวเราะเป็นพันล้านครั้ง" อาจเกิดขึ้นได้กับไฟล์ทุกรูปแบบที่สามารถบรรจุการขยายมาโครได้ ตัวอย่างเช่นระเบิด YAML นี้:

a : &a [ "lol" , "lol" , "lol" , "lol" , "lol" , "lol" , "lol" , "lol" , "lol" ] b : &b [ *a , * a , *a , *a , *a , * a , *a , *a ] c : &c [ *b , *b , * b , * b , *b , * b , *b , *b , *b ] d : &d [ *c , * c , *c , *c , * c , * c , *c , *c ] e : &e [ *d , * d , *d , * d , *d , *d , *d , *d ] f : &f [ *e , *e , *e , *e , *e , *e , *e , *e , *e ] g : &g [ *f , *f , * f , *f , *f , *f , *f , * f ] h : &h [ *g , *g , * g , *g , *g , *g , *g , * g ] i : & i [ * h , *h , *h , *h , * h , * h , * h , *h ]

ปัญหานี้ทำให้ Goเวอร์ชันก่อนหน้าเกิดข้อผิดพลาดเนื่องจากตัวประมวลผล YAML ของ Go (ซึ่งขัดกับข้อกำหนดของ YAML) ขยายการอ้างอิงราวกับว่าเป็นมาโคร จึงได้มีการแก้ไขตัวประมวลผล YAML ของ Go เพื่อให้การแยกวิเคราะห์ล้มเหลวหากอ็อบเจ็กต์ผลลัพธ์มีขนาดใหญ่เกินไป

ซอฟต์แวร์ระดับองค์กรอย่างKubernetesได้รับผลกระทบจากการโจมตีนี้ผ่านทางตัวแยกวิเคราะห์ YAML [ 6 ] [ 7 ]ด้วยเหตุนี้ จึงนิยมใช้ตัวแยกวิเคราะห์ที่มีขีดความสามารถจำกัดโดยเจตนา (เช่น StrictYAML) หรือรูปแบบไฟล์ที่ไม่อนุญาตให้มีการอ้างอิงสำหรับข้อมูลที่มาจากแหล่งที่ไม่น่าเชื่อถือ[ 8 ]

ดูเพิ่มเติม

  • คำจำกัดความประเภทเอกสาร  – ชุดของการประกาศมาร์กอัปสำหรับภาษามาร์กอัปตระกูล SGML (DTD) ซึ่งเป็นแม่แบบสำหรับการตรวจสอบความถูกต้องของไฟล์ XML
  • Fork bomb  – รูปแบบหนึ่งของการโจมตีแบบปฏิเสธการให้บริการ (Denial-of-Service) ซึ่งเป็นวิธีการที่คล้ายกันในการใช้ทรัพยากรของระบบจนหมดผ่านการเรียกซ้ำ (recursion)
  • การเรียกซ้ำ  – กระบวนการทำซ้ำรายการในลักษณะที่คล้ายคลึงกัน
  • การโจมตีด้วย XML External Entity  – รูปแบบหนึ่งของการโจมตีระบบคอมพิวเตอร์
  • Zip bomb  – ไฟล์บีบอัดที่เป็นอันตรายซึ่งออกแบบมาเพื่อขัดขวางโปรแกรมหรือระบบที่กำลังอ่านไฟล์นั้น เป็นการโจมตีที่คล้ายคลึงกันโดยใช้ไฟล์บีบอัดแบบ Zip
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Billion_laughs_attack&oldid=1350414770 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ การโจมตีด้วยเสียงหัวเราะนับพันล้าน

ในด้าน ความปลอดภัยทางคอมพิวเตอร์ การโจมตี แบบ Billion Laughs เป็นการ โจมตีแบบปฏิเสธการให้บริการ (DoS attack) ประเภทหนึ่งซึ่งมุ่งเป้าไปที่ ตัวแยก วิเคราะห์เอกสาร XML [ 1 ]

รายละเอียด

ตัวอย่างการโจมตีประกอบด้วยการกำหนดเอนทิตี 10 รายการ โดยแต่ละรายการประกอบด้วยเอนทิตีรายการก่อนหน้า 10 รายการ และเอกสารประกอบด้วยอินสแตนซ์เดียวของเอนทิตีที่ใหญ่ที่สุด ซึ่งจะขยายออกไปเป็นหนึ่ง พันล้าน สำเนาของเอนทิตีแรก...

ตัวอย่างโค้ด

เมื่อตัวแยกวิเคราะห์ XML โหลดเอกสารนี้ มันจะเห็นว่าเอกสารนี้มีองค์ประกอบรากหนึ่งรายการคือ "lolz" ซึ่งมีข้อความ "&lol9;" อย่างไรก็ตาม "&lol9;" เป็นเอนทิตีที่กำหนดไว้ซึ่งขยายเป็นสตริงที่มีสตริง "&lol8;" สิบสตริง แต่ละสตริง "&lol8;"...

การเปลี่ยนแปลง

การโจมตีด้วยเสียงหัวเราะพันล้านครั้งที่อธิบายไว้ข้างต้นอาจใช้พื้นที่หรือเวลาในปริมาณ มหาศาล การเปลี่ยนแปลง การระเบิดแบบกำลังสอง ทำให้ ความต้องการทรัพยากร เพิ่มขึ้นแบบกำลังสอง โดยการทำซ้ำเอนทิตีขนาดใหญ่ซ้ำแล้วซ้ำเล่า...