คู่มือ: Code Obfuscation Reverse-Engineering
เผยแพร่แล้ว: 2021-11-17ตัวเลขของการสร้างความสับสนในโค้ดเป็นหนึ่งในวิธีการรักษาความปลอดภัยแอปพลิเคชันที่ได้รับความนิยมมากที่สุดสำหรับการป้องกันการแฮ็กแอปพลิเคชัน เป็นหนึ่งในความพยายามของ AppSec ที่ได้รับการแนะนำบ่อยที่สุดโดยผู้เชี่ยวชาญด้านความปลอดภัยทั่วโลก และมักจะดูแลข้อกำหนดด้านความปลอดภัยเพียงเล็กน้อยของแอปพลิเคชันของคุณ กลยุทธ์นี้มักใช้เป็นกลไกสำคัญในการป้องกันความพยายามในการแฮ็กข้อมูล และป้องกันภัยคุกคามทั่วไป เช่น การแทรกโค้ด วิศวกรรมย้อนกลับ และการปลอมแปลงข้อมูลส่วนบุคคลของลูกค้าและผู้ใช้แอปพลิเคชัน
ความสับสนของรหัส?
แนวทางปฏิบัติในการสร้างความสับสนให้กับไฟล์สั่งการซึ่งไม่สามารถเข้าใจได้ เข้าใจได้ หรือใช้งานได้จริงอีกต่อไปเรียกว่า Code obfuscation ซอร์สโค้ดถูกทำให้งงงวยจนถึงระดับที่เข้าใจยากและยากสำหรับบุคคลที่สามที่จะเข้าใจ นับประสาดำเนินการเพียงอย่างเดียว UI ของผู้ใช้ปลายทางหรือผลลัพธ์ที่ตั้งใจไว้ของโค้ดจะไม่ได้รับผลกระทบจากความคลุมเครือ เป็นเพียงขั้นตอนในการป้องกันไว้ก่อนเพื่อทำให้โค้ดไม่มีประโยชน์สำหรับแฮ็กเกอร์ที่อาจเข้าถึงโค้ดสั่งการของซอฟต์แวร์
เหตุใดจึงต้องทำให้โค้ดสับสน
ความสับสนของรหัสมีความสำคัญอย่างยิ่งสำหรับซอฟต์แวร์โอเพนซอร์สซึ่งมีข้อเสียอย่างมากในแง่ของความสามารถในการแฮ็กเพื่อประโยชน์ส่วนตัว นักพัฒนารับประกันว่าทรัพย์สินทางปัญญาของผลิตภัณฑ์ของตนได้รับการปกป้องจากความเสี่ยงด้านความปลอดภัย การเข้าถึงที่ผิดกฎหมาย และการค้นพบข้อบกพร่องของแอปพลิเคชันโดยทำให้โปรแกรมทำวิศวกรรมย้อนกลับได้ยาก
โดยไม่คำนึงถึงประเภทของเทคนิคการปิดบังที่ใช้ วิธีการนี้จะจำกัดซอร์สโค้ดที่เป็นอันตรายและรับรองความปลอดภัยของโปรแกรมในระดับต่างๆ เหตุผลด้านเวลา ต้นทุน และทรัพยากรต่างก็ชอบที่จะละทิ้งโค้ดของคุณเมื่อถูกทำให้สับสน เนื่องจากโค้ดที่ถอดรหัสแล้วไม่สามารถอ่านได้
เทคนิคในการทำให้โค้ดสับสน
Obfuscation ทำงานได้ในระดับต่างๆ: อาจใช้งานที่ระดับโครงสร้างโค้ดความหมาย/ศัพท์ หรือที่โครงสร้างข้อมูล/ระดับการควบคุม กลยุทธ์การสร้างความสับสนยังแตกต่างกันไปตามการดำเนินการในโค้ด โดยพื้นฐานแล้ว ทีมรักษาความปลอดภัยจะกำหนดประเภทของความสับสนที่จะใช้กับโค้ดร่วมกับทีมพัฒนา
ควรเปลี่ยนชื่อการทำให้งงงวย
วิธีการนี้ทำให้เกิดความสับสนในการตั้งชื่อตัวแปรเพื่อที่จุดประสงค์ที่แท้จริงของการใช้ตัวแปรเหล่านี้จะถูกซ่อนไว้อย่างชาญฉลาด ดีคอมไพเลอร์มีปัญหาในการทำความเข้าใจโฟลว์การควบคุม เนื่องจากเมธอดและตัวแปรถูกเปลี่ยนชื่อด้วยสัญลักษณ์และตัวเลขต่างๆ วิธีการสร้างความสับสนนี้มักใช้เพื่อปิดบังโค้ดแอปพลิเคชันแพลตฟอร์ม Java,.NET และ Android การจัดประเภทนี้เป็นการทำให้สับสนของเลย์เอาต์เนื่องจากกำหนดเป้าหมายซอร์สโค้ดโดยตรงเพื่อให้เป็นชั้นป้องกันสำหรับแอปพลิเคชัน
ความสับสนของข้อมูล
วิธีนี้เน้นที่โครงสร้างข้อมูลที่ใช้ในโค้ด ทำให้แฮกเกอร์เข้าถึงเป้าหมายที่แท้จริงของโปรแกรมไม่ได้ ซึ่งอาจนำมาซึ่งการเปลี่ยนแปลงวิธีการจัดเก็บข้อมูลในหน่วยความจำโดยซอฟต์แวร์และวิธีการประมวลผลข้อมูลเพื่อให้ได้ผลลัพธ์สุดท้าย ขั้นตอนนี้สามารถทำได้หลายวิธี:
1. การทำให้งงงวยของการรวม
วิธีการบันทึกข้อมูลในซอฟต์แวร์จะเปลี่ยนแปลงไปจากสาเหตุนี้ ตัวอย่างเช่น อาร์เรย์อาจแบ่งออกเป็นหลายอาร์เรย์ย่อยที่สามารถอ้างอิงได้ตลอดทั้งโปรแกรม
2. ความสับสนในการจัดเก็บข้อมูล
สิ่งนี้มีผลกระทบต่อวิธีการจัดเก็บข้อมูลในหน่วยความจำ ตัวอย่างเช่น นักพัฒนาสามารถสับเปลี่ยนระหว่างพื้นที่จัดเก็บตัวแปรภายในและส่วนกลางเพื่อปิดบังลักษณะที่แท้จริงของพฤติกรรมของตัวแปร
3. รับความสับสนตามต้องการ
วิธีการนี้จะเปลี่ยนลำดับของข้อมูลโดยไม่เปลี่ยนการทำงานของโปรแกรม/ข้อมูลโค้ด นักพัฒนาบรรลุสิ่งนี้โดยการสร้างโมดูลที่แตกต่างซึ่งถูกเรียกใช้สำหรับแต่ละอินสแตนซ์ของการอ้างอิงตัวแปร
4. การเข้ารหัสสตริง
เทคนิคนี้เข้ารหัสสตริงที่อ่านได้ทั้งหมด ส่งผลให้โค้ดอ่านไม่ออก เมื่อซอฟต์แวร์ทำงาน จะต้องถอดรหัสเมื่อรันไทม์
5. ความสับสนของการควบคุม/การไหลของรหัส
ลักษณะที่การควบคุมถูกส่งผ่านจากส่วนหนึ่งของ codebase ไปยังส่วนอื่นมีความสำคัญในการกำหนดเป้าหมายของโปรแกรม การทำให้ขั้นตอนนี้ยุ่งเหยิงมักจะเป็นวิธีที่ให้ผลกำไรมากที่สุดในการบิดเบือนการไหลของเกม กลยุทธ์การทำให้งงงวยนี้ช่วยให้แฮ็กเกอร์สามารถหลีกเลี่ยงได้โดยทำให้พวกเขาเข้าใจได้ยากว่าโค้ดติดตามเส้นทางที่เฉพาะเจาะจงได้อย่างไรและเพราะเหตุใด
การรวมคำสั่งสุ่มและข้อความที่ไม่คาดคิด รวมไปถึงคำสั่ง case-switch ที่ไม่จำเป็น (โค้ดที่ไม่ทำงาน) ที่จะไม่มีวันถูกดำเนินการ เป็นวิธีหนึ่งที่แพร่หลายที่สุดในการบรรลุกลยุทธ์การทำให้งงงวยนี้สำเร็จ การยืนยันเหล่านี้ไม่มีฟังก์ชันอื่นนอกจากทำให้แฮ็กเกอร์เป้าหมายสับสน ในกรณีของการวางแนวโปรแกรมแบบมีเงื่อนไข การเปลี่ยนแปลงในลำดับของคำสั่งการดำเนินการโปรแกรมจะเป็นประโยชน์อย่างยิ่ง

Obfuscation กำลังถูกดีบั๊ก
ข้อมูลการดีบักมักมีประโยชน์ในการพิจารณาข้อมูลสำคัญเกี่ยวกับการไหลของโปรแกรมและข้อบกพร่องโดยการถอดรหัสและคอมไพล์ซอร์สโค้ดใหม่ จำเป็นอย่างยิ่งที่จะต้องซ่อนข้อมูลระบุตัวตนดังกล่าวโดยแก้ไขข้อมูลระบุตัวตน หมายเลขบรรทัด หรือปิดการเข้าถึงข้อมูลแก้ไขข้อบกพร่องทั้งหมด
ควรจัดการกับความสับสน
ข้อผิดพลาดในการเขียนโปรแกรมหน่วยความจำได้เพิ่มขึ้นอย่างกว้างขวางในการโจมตี โดยเฉพาะอย่างยิ่งในภาษาที่ไม่ปลอดภัยสำหรับหน่วยความจำ เช่น C และ C++ ข้อบกพร่องด้านความปลอดภัยมักเกิดจากข้อผิดพลาด เช่น การเข้าถึงอาร์เรย์ที่ไม่มีการควบคุม วิธีการสร้างความสับสนให้กับที่อยู่ทำให้วิศวกรรมย้อนกลับทำได้ยาก เนื่องจากที่อยู่เสมือนของรหัสและข้อมูลของโปรแกรมจะถูกสุ่มทุกครั้งที่ทำการแปลงรหัส ด้วยเหตุนี้ การโจมตีที่ผิดพลาดของหน่วยความจำส่วนใหญ่จึงไม่สามารถกำหนดได้ และมีโอกาสประสบความสำเร็จต่ำมาก
การเข้ารหัสส่วนบุคคล
นักพัฒนาใช้วิธีนี้ในการเข้ารหัสสตริงด้วยอัลกอริธึมที่กำหนดเอง จากนั้นจึงจัดเตรียมฟังก์ชันตัวถอดรหัสเพื่อกู้คืนโค้ดต้นฉบับ
อาร์กิวเมนต์ผ่านไปที่รันไทม์
เป็นไปได้ที่จะแก้ไขโปรแกรมโดยคาดหวังพารามิเตอร์ที่รันไทม์ ในการถอดรหัสตัวแปร ผู้ใช้ต้องมีทั้งรหัสและคีย์ถอดรหัส
ในการพัฒนาวิธีการป้องกันแบบเลเยอร์สำหรับปกป้องแอปพลิเคชันจากภัยคุกคามด้านความปลอดภัยที่หลากหลาย ทีมรักษาความปลอดภัยอาจเลือกใช้มากกว่าหนึ่งเทคนิคในเวลาเดียวกัน
บทสรุป
โดยสรุปแล้ว การชี้ทางผิดเพียงอย่างเดียวไม่ได้ผลในการต่อสู้กับข้อกังวลด้านความปลอดภัยขั้นสูง เป็นการยากที่จะถอดรหัสซอร์สโค้ดที่สร้างความสับสน เนื่องจากความพร้อมใช้งานของซอฟต์แวร์ ai และทักษะของแฮกเกอร์ แต่ก็ใช่ว่าจะเป็นไปไม่ได้ ด้วยเหตุนี้ การเข้ารหัสจึงไม่ใช่ยาครอบจักรวาลสำหรับข้อกังวลด้านความปลอดภัยของซอฟต์แวร์ทั้งหมด
ทีมพัฒนาอาจใช้วิธีการสร้างความสับสนของโค้ดที่หลากหลายเพื่อรักษาความปลอดภัยให้กับโค้ดในสภาพแวดล้อมที่ไม่น่าเชื่อถือ ทั้งนี้ขึ้นอยู่กับความต้องการด้านความปลอดภัย ลักษณะของโปรแกรม และเกณฑ์มาตรฐานประสิทธิภาพ ควรดำเนินการเหล่านี้โดยคำนึงถึงข้อดีและข้อเสียของแต่ละวิธี กลยุทธ์นี้ควรสนับสนุนแนวคิดริเริ่มของ AppSec อื่นๆ เช่น การเข้ารหัส RASP ข้อบังคับการเก็บรักษาข้อมูล และอื่นๆ เมื่อรวมกับโซลูชัน RASP เช่น AppSeling จะกลายเป็นยาแก้พิษที่มีปัญหาด้านความปลอดภัยในปัจจุบัน