อ่าน 3 นาที
แหล่งที่มาของโทรจัน
Trojan Sourceเป็นช่องโหว่ซอฟต์แวร์ที่ใช้ประโยชน์จากอักขระแบบสองทิศทางของUnicode เพื่อแสดง
แหล่งที่มาของโทรจัน
| ตัวระบุ CVE | |
|---|---|
| วันที่ค้นพบ | 9 กันยายน 2564 |
| ดิสคัฟเวอร์เนอร์ | นิโคลัส บูเชอร์, รอสส์ แอนเดอร์สัน |
| ซอฟต์แวร์ที่ได้รับผลกระทบ | ยูนิโค้ด , ซอร์สโค้ด |
| เว็บไซต์ | trojansource |
Trojan Sourceเป็นช่องโหว่ซอฟต์แวร์ที่ใช้ประโยชน์จากอักขระแบบสองทิศทางของUnicode เพื่อแสดง โค้ดต้นฉบับแตกต่างจากการทำงานจริงของโค้ดต้นฉบับ[ 1 ]การโจมตีนี้ใช้ประโยชน์จากวิธีการแสดงและเข้ารหัสสคริปต์การเขียนที่มีทิศทางการอ่านต่างกันบนคอมพิวเตอร์ ช่องโหว่นี้ถูกค้นพบโดย Nicholas Boucher และ Ross Anderson ที่มหาวิทยาลัยเคมบริดจ์ในช่วงปลายปี 2021 [ 2 ]
พื้นหลัง
Unicode เป็นมาตรฐานการเข้ารหัสสำหรับการแสดงข้อความ สัญลักษณ์ และอักษรภาพ Unicode เป็นการเข้ารหัสที่โดดเด่นที่สุดในคอมพิวเตอร์ โดยใช้ในเว็บไซต์มากกว่า 98% ณ เดือนกันยายน 2023 [ 3 ] Unicode รองรับหลายภาษา และด้วยเหตุนี้จึงต้องรองรับวิธีการเขียนข้อความที่แตกต่างกัน ซึ่งต้องรองรับทั้ง ภาษาที่ เขียนจากซ้ายไปขวาเช่น ภาษาอังกฤษและภาษารัสเซีย และภาษาที่ เขียน จากขวาไปซ้าย เช่น ภาษา ฮิบรูและภาษาอาหรับเนื่องจาก Unicode มีเป้าหมายเพื่อให้สามารถใช้ระบบการเขียนได้มากกว่าหนึ่งระบบ จึงต้องสามารถผสมผสานสคริปต์ที่มีลำดับการแสดงผลที่แตกต่างกันและแก้ไขลำดับที่ขัดแย้งกันได้ เพื่อแก้ปัญหานี้ Unicode จึงมีอักขระที่เรียกว่าอักขระสองทิศทาง ( Bidi ) ที่อธิบายวิธีการแสดงและแทนข้อความ อักขระเหล่านี้สามารถนำไปใช้ในทางที่ผิดเพื่อเปลี่ยนวิธีการตีความข้อความโดยไม่ต้องเปลี่ยนภาพ เนื่องจากอักขระเหล่านี้มักมองไม่เห็น[ 4 ]
| คำย่อ | ชื่อ | คำอธิบาย |
|---|---|---|
| แอลอาร์อี | U+202Aการฝังจากซ้ายไปขวา | ลองอ่านข้อความต่อไปนี้จากซ้ายไปขวา |
| อาร์แอลอี | U+202Bการฝังจากขวาไปซ้าย | ลองอ่านข้อความต่อไปนี้จากขวาไปซ้าย |
| แอลอาร์โอ | U+202Dการควบคุมจากซ้ายไปขวา | บังคับให้ประมวลผลข้อความต่อไปนี้จากซ้ายไปขวา |
| อาร์โล | U+202Eการควบคุมจากขวาไปซ้าย | บังคับให้ประมวลผลข้อความต่อไปนี้จากขวาไปซ้าย |
| แอลอาร์ไอ | U+2066แยก จากซ้ายไปขวา | บังคับให้ข้อความต่อไปนี้อ่านจากซ้ายไปขวา โดยไม่ส่งผลกระทบต่อข้อความที่อยู่ติดกัน |
| อาร์แอลไอ | U+2067แยก จากขวา | บังคับให้ข้อความต่อไปนี้อ่านจากขวาไปซ้าย โดยไม่ส่งผลกระทบต่อข้อความที่อยู่ติดกัน |
| เอฟเอสไอ | U+2068แยกเดี่ยวที่แข็งแกร่ง ครั้งแรก | บังคับให้ข้อความต่อไปนี้ทำงานไปในทิศทางที่ระบุโดยอักขระตัวถัดไป |
| พีดี | U+202Cการจัดรูปแบบทิศทางป๊อป | ยุติการทำงานของ LRE, RLE, LRO หรือ RLO ที่ใกล้ที่สุด |
| พีดีไอ | U+2069 POP DIRECTIONAL ISOLATE | ยุติการเชื่อมต่อ LRI หรือ RLI ที่ใกล้ที่สุด |
ระเบียบวิธีวิจัย
ในช่องโหว่ นี้ มีการใช้ ตัวอักษรสองทิศทางในทางที่ผิดเพื่อจัดเรียงลำดับข้อความในโค้ดต้นฉบับใหม่ ทำให้การประมวลผลในภายหลังเกิดขึ้นในลำดับที่แตกต่างกัน ตัวอักษรสองทิศทางสามารถแทรกเข้าไปในส่วนของโค้ดต้นฉบับที่อนุญาตให้ใช้สตริงได้ ซึ่งมักใช้กับเอกสาร ตัวแปร หรือความคิดเห็น
| โค้ดต้นฉบับพร้อมคำแนะนำ | โค้ดต้นฉบับแสดงผลในรูปแบบภาพ | การตีความซอร์สโค้ด |
|---|---|---|
def sum ( num1 , num2 ): '''บวก num1 และ num2 แล้ว [RLI] ''' ; return return num1 + num2 | def sum ( num1 , num2 ): '''บวก num1 กับ num2 แล้วส่งคืน; ''' return num1 + num2 | def sum ( num1 , num2 ): '''บวก num1 กับ num2 แล้ว''' ; return return num1 + num2 |
ในตัวอย่างข้างต้น เครื่องหมาย RLI (right-to-left isolate) บังคับให้ข้อความต่อไปนี้ถูกตีความแตกต่างจากที่แสดง: เครื่องหมายอัญประกาศสามตัวจะอยู่ก่อน (สิ้นสุดสตริง) ตามด้วยเครื่องหมายเซมิโคลอน (ขึ้นบรรทัดใหม่) และสุดท้ายคือการขึ้นบรรทัดใหม่ก่อนกำหนด (คืนค่าNoneและไม่สนใจโค้ดใดๆ ที่อยู่ด้านล่าง) การขึ้นบรรทัดใหม่จะยุติเครื่องหมาย RLI ป้องกันไม่ให้มันไหลไปยังโค้ดด้านล่าง เนื่องจากอักขระ Bidi โปรแกรมแก้ไขซอร์สโค้ดและIDE บางตัว จะจัดเรียงโค้ดใหม่สำหรับการแสดงผลโดยไม่มีการบ่งชี้ทางสายตาว่าโค้ดได้รับการจัดเรียงใหม่ ดังนั้นผู้ตรวจสอบโค้ดที่เป็นมนุษย์จึงมักจะไม่ตรวจพบ อย่างไรก็ตาม เมื่อโค้ดถูกแทรกเข้าไปในคอมไพเลอร์ คอมไพเลอร์อาจไม่สนใจอักขระ Bidi และประมวลผลอักขระในลำดับที่แตกต่างจากที่แสดงทางสายตา เมื่อคอมไพเลอร์ทำงานเสร็จสิ้น มันอาจสามารถเรียกใช้โค้ดที่ดูเหมือนจะไม่สามารถเรียกใช้งานได้[ 5 ]เครื่องหมายการจัดรูปแบบสามารถรวมกันได้หลายครั้งเพื่อสร้างการโจมตีที่ซับซ้อน[ 6 ]
ผลกระทบและการบรรเทา
ภาษาโปรแกรมที่รองรับสตริง Unicode และปฏิบัติตามอัลกอริทึม Bidi ของ Unicode มีความเสี่ยงต่อการโจมตี ซึ่ง รวมถึงภาษาต่างๆ เช่นJava , Go , C , C++ , C# , PythonและJavaScript [ 7 ]
แม้ว่าการโจมตีจะไม่ใช่ข้อผิดพลาดโดยตรง แต่คอมไพเลอร์ อินเตอร์พรีเตอร์ และเว็บไซต์หลายแห่งได้เพิ่มคำเตือนหรือมาตรการบรรเทาผลกระทบสำหรับการโจมตีดังกล่าว ทั้งGNU GCCและLLVMได้รับคำขอให้จัดการกับการโจมตีนี้[ 8 ] Marek Polacek ได้ส่งแพตช์ไปยัง GCC ไม่นานหลังจากที่การโจมตีถูกเผยแพร่ ซึ่งได้นำคำเตือนสำหรับอักขระทิศทางที่อาจไม่ปลอดภัยมาใช้ ฟังก์ชันนี้ถูกรวมเข้ากับ GCC 12 ภายใต้-Wbidi-charsแฟล็ก[ 9 ] [ 10 ] LLVM ก็ได้รวมแพตช์ที่คล้ายกันเช่นกัน Rustได้แก้ไขการโจมตีในเวอร์ชัน 1.56.1 โดยปฏิเสธโค้ดที่มีอักขระดังกล่าวโดยค่าเริ่มต้น นักพัฒนา Rust ไม่พบแพ็กเกจที่มีช่องโหว่ก่อนการแก้ไข[ 11 ]
โปรแกรมแก้ไขซอร์สโค้ดและ IDE หลายตัวในปัจจุบันทำให้ตัวอักษรที่อาจไม่ปลอดภัยเหล่านี้มองเห็นได้ชัดเจนยิ่งขึ้น Visual Studio Codeจะแสดงตัวอักษรควบคุมโดยค่าเริ่มต้น[ 12 ] Notepad++และvimได้ทำให้ตัวอักษรเหล่านี้มองเห็นได้ชัดเจนยิ่งขึ้นแล้ว ตามที่ระบุไว้ในเอกสารวิจัย[ 13 ]
Red Hatได้ออกคำแนะนำบนเว็บไซต์ของตน โดยระบุว่าช่องโหว่นี้เป็น "ระดับปานกลาง" [ 14 ] GitHubได้ออกคำเตือนบนบล็อกของตน รวมถึงอัปเดตเว็บไซต์เพื่อแสดงกล่องโต้ตอบเมื่อตรวจพบอักขระ Bidi ในโค้ดของที่เก็บข้อมูล[ 15 ]
ลิงก์ภายนอก
- เว็บไซต์ https://trojansource.codes/สร้างขึ้นโดยผู้ค้นพบคือ Nicholas Boucher และ Ross Anderson
- โค้ดต้นแบบเพื่อพิสูจน์แนวคิด
- เอกสารวิจัยฉบับเต็มของ Trojan Source
- ฐานข้อมูลช่องโหว่แห่งชาติของ NISTและCVE (Common Vulnerability and Exposures)
- CVE-2021-42574 - NIST & CVE (ช่องโหว่ BIDI)
- CVE-2021-42694 - NIST & CVE (การโจมตีด้วยคำที่เหมือนกัน)
- UAX 9จากUnicode Consortiumเกี่ยวกับอักขระสองทิศทางและการจัดรูปแบบ
- เอกสาร Unicode UTR 36จากUnicode Consortiumอธิบายถึงช่องโหว่ใน Unicode
- รายงานช่องโหว่ CERT/CC
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ แหล่งที่มาของโทรจัน
Trojan Sourceเป็นช่องโหว่ซอฟต์แวร์ที่ใช้ประโยชน์จากอักขระแบบสองทิศทางของUnicode เพื่อแสดง
พื้นหลัง
Unicode เป็นมาตรฐานการเข้ารหัสสำหรับการแสดงข้อความ สัญลักษณ์ และอักษรภาพ Unicode เป็นการเข้ารหัสที่โดดเด่นที่สุดในคอมพิวเตอร์ โดยใช้ในเว็บไซต์มากกว่า 98% ณ เดือนกันยายน 2023 [ 3 ] Unicode รองรับหลายภาษา...
ระเบียบวิธีวิจัย
ในช่องโหว่ นี้ มีการใช้ ตัวอักษรสองทิศทางใน ทางที่ผิดเพื่อจัดเรียงลำดับข้อความในโค้ดต้นฉบับใหม่ ทำให้การประมวลผลในภายหลังเกิดขึ้นในลำดับที่แตกต่างกัน ตัวอักษรสองทิศทางสามารถแทรกเข้าไปในส่วนของโค้ดต้นฉบับที่อนุญาตให้ใช้สตริงได้ ซึ่งมักใช้กับเอกสาร ตัวแปร...
ผลกระทบและการบรรเทา
ภาษาโปรแกรมที่รองรับสตริง Unicode และปฏิบัติตามอัลกอริทึม Bidi ของ Unicode มีความเสี่ยงต่อการโจมตี ซึ่ง รวมถึงภาษาต่างๆ เช่น Java , Go , C , C++ , C# , Python และ JavaScript [ 7 ]