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

อ่าน 3 นาที

แหล่งที่มาของโทรจัน

Trojan Sourceเป็นช่องโหว่ซอฟต์แวร์ที่ใช้ประโยชน์จากอักขระแบบสองทิศทางของUnicode เพื่อแสดง

แหล่งที่มาของโทรจัน

แหล่งที่มาของโทรจัน
ตัวระบุ CVE
  • CVE - 2021-42574
  • CVE - 2021-42694
วันที่ค้นพบ9 กันยายน 2564 ( 9 กันยายน 2021 )
ดิสคัฟเวอร์เนอร์นิโคลัส บูเชอร์, รอสส์ แอนเดอร์สัน
ซอฟต์แวร์ที่ได้รับผลกระทบยูนิโค้ด , ซอร์สโค้ด
เว็บไซต์trojansource .codes

Trojan Sourceเป็นช่องโหว่ซอฟต์แวร์ที่ใช้ประโยชน์จากอักขระแบบสองทิศทางของUnicode เพื่อแสดง โค้ดต้นฉบับแตกต่างจากการทำงานจริงของโค้ดต้นฉบับ[ 1 ]การโจมตีนี้ใช้ประโยชน์จากวิธีการแสดงและเข้ารหัสสคริปต์การเขียนที่มีทิศทางการอ่านต่างกันบนคอมพิวเตอร์ ช่องโหว่นี้ถูกค้นพบโดย Nicholas Boucher และ Ross Anderson ที่มหาวิทยาลัยเคมบริดจ์ในช่วงปลายปี 2021 [ 2 ]

พื้นหลัง

Unicode เป็นมาตรฐานการเข้ารหัสสำหรับการแสดงข้อความ สัญลักษณ์ และอักษรภาพ Unicode เป็นการเข้ารหัสที่โดดเด่นที่สุดในคอมพิวเตอร์ โดยใช้ในเว็บไซต์มากกว่า 98% ณ เดือนกันยายน 2023 [ 3 ] Unicode รองรับหลายภาษา และด้วยเหตุนี้จึงต้องรองรับวิธีการเขียนข้อความที่แตกต่างกัน ซึ่งต้องรองรับทั้ง ภาษาที่ เขียนจากซ้ายไปขวาเช่น ภาษาอังกฤษและภาษารัสเซีย และภาษาที่ เขียน จากขวาไปซ้าย เช่น ภาษา ฮิบรูและภาษาอาหรับเนื่องจาก Unicode มีเป้าหมายเพื่อให้สามารถใช้ระบบการเขียนได้มากกว่าหนึ่งระบบ จึงต้องสามารถผสมผสานสคริปต์ที่มีลำดับการแสดงผลที่แตกต่างกันและแก้ไขลำดับที่ขัดแย้งกันได้ เพื่อแก้ปัญหานี้ Unicode จึงมีอักขระที่เรียกว่าอักขระสองทิศทาง ( Bidi ) ที่อธิบายวิธีการแสดงและแทนข้อความ อักขระเหล่านี้สามารถนำไปใช้ในทางที่ผิดเพื่อเปลี่ยนวิธีการตีความข้อความโดยไม่ต้องเปลี่ยนภาพ เนื่องจากอักขระเหล่านี้มักมองไม่เห็น[ 4 ]

อักขระจัดรูปแบบสองทิศทาง Unicode ที่เกี่ยวข้อง
คำย่อ ชื่อ คำอธิบาย
แอลอาร์อี 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 ที่ใกล้ที่สุด

ระเบียบวิธีวิจัย

ในช่องโหว่ นี้ มีการใช้ ตัวอักษรสองทิศทางในทางที่ผิดเพื่อจัดเรียงลำดับข้อความในโค้ดต้นฉบับใหม่ ทำให้การประมวลผลในภายหลังเกิดขึ้นในลำดับที่แตกต่างกัน ตัวอักษรสองทิศทางสามารถแทรกเข้าไปในส่วนของโค้ดต้นฉบับที่อนุญาตให้ใช้สตริงได้ ซึ่งมักใช้กับเอกสาร ตัวแปร หรือความคิดเห็น

โค้ด Pythonที่มีช่องโหว่
โค้ดต้นฉบับพร้อมคำแนะนำ โค้ดต้นฉบับแสดงผลในรูปแบบภาพ การตีความซอร์สโค้ด
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
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Trojan_Source&oldid=1358282835 "

สรุปเนื้อหา

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

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

Trojan Sourceเป็นช่องโหว่ซอฟต์แวร์ที่ใช้ประโยชน์จากอักขระแบบสองทิศทางของUnicode เพื่อแสดง

พื้นหลัง

Unicode เป็นมาตรฐานการเข้ารหัสสำหรับการแสดงข้อความ สัญลักษณ์ และอักษรภาพ Unicode เป็นการเข้ารหัสที่โดดเด่นที่สุดในคอมพิวเตอร์ โดยใช้ในเว็บไซต์มากกว่า 98% ณ เดือนกันยายน 2023 [ 3 ] Unicode รองรับหลายภาษา...

ระเบียบวิธีวิจัย

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

ผลกระทบและการบรรเทา

ภาษาโปรแกรมที่รองรับสตริง Unicode และปฏิบัติตามอัลกอริทึม Bidi ของ Unicode มีความเสี่ยงต่อการโจมตี ซึ่ง รวมถึงภาษาต่างๆ เช่น Java , Go , C , C++ , C# , Python และ JavaScript [ 7 ]