ที่เก็บนี้มีรหัสส่วนใหญ่ของกระดาษ CCS'19 ของเรา: "Hidenoseek: การพราง
โปรดทราบว่าในสถานะปัจจุบันรหัสเป็น POC และไม่ใช่ API ที่พร้อมผลิตเต็มรูปแบบ
Hidenoseek เป็นการโจมตีลายพรางนวนิยายและทั่วไปซึ่งเปลี่ยนโครงสร้างของตัวอย่าง JavaScript ที่เป็นอันตรายเพื่อสร้างไวยากรณ์ที่เป็นพิษเป็นภัยที่มีอยู่อย่างแน่นอน เพื่อจุดประสงค์นี้เราจะปรับปรุงต้นไม้ไวยากรณ์นามธรรม (AST) ของอินพุตจาวาสคริปต์ที่ถูกต้องพร้อมข้อมูลการควบคุมและข้อมูลการไหลของข้อมูล เราอ้างถึงโครงสร้างข้อมูลผลลัพธ์เป็นกราฟการพึ่งพาโปรแกรม (PDG) โดยเฉพาะอย่างยิ่ง Hidenoseek มองหา subgraphs isomorphic ระหว่างไฟล์ที่เป็นอันตรายและไฟล์ที่อ่อนโยน โดยเฉพาะอย่างยิ่งมันแทนที่การเข้าร่วมย่อยที่เป็นพิษเป็นภัยโดยเทียบเท่าที่เป็นอันตราย (โครงสร้างไวยากรณ์เดียวกัน) และปรับการพึ่งพาข้อมูลที่ไม่เป็นพิษเป็นภัย-โดยไม่ต้องเปลี่ยน AST– เพื่อให้ความหมายที่เป็นอันตรายถูกเก็บไว้
ด้วยเหตุผลทางจริยธรรมเราตัดสินใจที่จะเผยแพร่รหัสที่สมบูรณ์ของโมดูลการเลือกโคลนของเราหรือโมดูลแทนที่โคลนของเรา ดังนั้นรุ่น Hidenoseek นี้สามารถใช้ใน การตรวจจับ โคลนนิ่งวากยสัมพันธ์ แต่ไม่ต้อง เขียนใหม่
install python3 # (tested with 3.6.7)
install nodejs # (tested with 8.10.0)
install npm # (tested with 3.5.2)
cd src
npm install escodegen # (tested with 1.9.1)
cd ..
Hidenoseek ทำงานโดยตรงในระดับ PDG ในการตรวจจับโคลนระหว่างโฟลเดอร์ JavaScript 2 โฟลเดอร์คุณควรสร้าง PDGs ล่วงหน้า (cf. การสร้าง PDGS) และให้พวกเขาเป็นอินพุตไปยังฟังก์ชัน src/samples_generation.replace_ast_df_folder
ในการตรวจจับโคลนนิ่งระหว่างตัวอย่าง JavaScript 2 ตัวอย่างคุณควรให้เส้นทางของไฟล์โดยตรงเป็นอินพุตไปยังฟังก์ชัน src/samples_generation.replace_ast
ในการสร้าง PDGs ของไฟล์ JS จากโฟลเดอร์โฟลเดอร์ cholder_name ให้เรียกใช้คำสั่งเชลล์ต่อไปนี้จากตำแหน่งโฟลเดอร์ src :
$ python3 -c "from pdgs_generation import store_pdg_folder; store_pdg_folder('FOLDER_NAME')"
PDGs ที่เกี่ยวข้องจะถูกเก็บไว้ใน folder_name/pdg
หากต้องการสร้าง PDG ของไฟล์ js ที่ได้รับหนึ่งอินพุต _file ให้เรียกใช้คำสั่ง python3 ต่อไปนี้จากตำแหน่งโฟลเดอร์ src :
>>> from pdgs_generation import get_data_flow
>>> pdg = get_data_flow('INPUT_FILE', benchmarks=dict())
ตามค่าเริ่มต้น PDG ที่เกี่ยวข้องจะไม่ถูกเก็บไว้ หากต้องการเก็บไว้ในโฟลเดอร์ PDG_Path ที่มีอยู่โทร:
>>> from pdgs_generation import get_data_flow
>>> pdg = get_data_flow('INPUT_FILE', benchmarks=dict(), store_pdgs='PDG_PATH')
โปรดทราบว่าสำหรับรุ่น Hidenoseek นี้เราได้เพิ่มการหมดเวลา 60 วินาทีสำหรับกระบวนการสร้าง PDG (cf. บรรทัดที่ 83 ของ src/pdgs_generation.py )
หากต้องการค้นหาโคลนระหว่าง PDG ที่ไม่เป็นพิษเป็นภัยจากโฟลเดอร์โฟลเดอร์ _benign_pdgs และสิ่งที่เป็นอันตรายจาก Folder_Malicious_pdgs เรียกใช้คำสั่ง Python3 ต่อไปนี้จากตำแหน่งโฟลเดอร์ src :
$ python3 -c "from samples_generation import replace_ast_df_folder; replace_ast_df_folder('FOLDER_BENIGN_PDGS', 'FOLDER_MALICIOUS_PDGS')"
สำหรับ PDG ที่เป็นอันตรายแต่ละรายการโฟลเดอร์ PDG_NAME-Analysis จะถูกสร้างขึ้นใน Folder_Malicious_PDGS สำหรับการวิเคราะห์ PDG ที่เป็นพิษเป็นภัยแต่ละรายการจะมีไฟล์ JSON (รูปแบบชื่อ: benign_malicious.json) ซึ่งสรุปการค้นพบหลักเช่นโหนดที่เหมือนกันสัดส่วนของโหนดที่เหมือนกันโทเค็นที่แตกต่างกัน
นอกจากนี้เราแสดงใน stdout รหัสที่เป็นพิษเป็นภัยและเป็นอันตรายของโคลนที่รายงาน สิ่งนี้สามารถปิดการใช้งานได้เช่นสำหรับการประมวลผลแบบมัลติโปรเซสเซอร์โดยแสดงความคิดเห็นการโทรไปยัง print_clones Line 153 ของ src/samples_generation.py
หากต้องการค้นหาโคลนนิ่งระหว่างไฟล์ JS ที่เป็นพิษเป็นภัย benign_js และ One Malicious_Js ที่เป็นอันตรายให้เปิดคำสั่ง Python3 ต่อไปนี้จากตำแหน่งโฟลเดอร์ src :
>>> from samples_generation import replace_ast
>>> replace_ast('BENIGN_JS', 'MALICIOUS_JS')
เอาต์พุตในแง่ของไฟล์ JSON และบน stdout เป็นไปก่อนหน้านี้
src/pdgs_generation.store_pdg_folder และ src/samples_generation.replace_ast_df_folder ฟังก์ชั่นแบบขนานอย่างสมบูรณ์ ในทั้งสองกรณีเรากำลังใช้ 1 CPU แต่คุณสามารถเปลี่ยนแปลงได้โดยการแก้ไขตัวแปร num_workers จาก src/utility_df.py หากคุณใช้ซีพียูมากกว่า 1 CPU คุณควรแสดงความคิดเห็นการโทรไปยัง print_clones Line 153 ของ src/samples_generation.py
example/Benign-example มี example.js ตัวอย่างที่ไม่เป็นพิษเป็นภัยจากกระดาษของเราในขณะที่ example/Malicious-seed/seed.js เป็นเมล็ดพันธุ์ที่เป็นอันตรายจากกระดาษของเรา
ในการตรวจจับโคลนระหว่างไฟล์ 2 ไฟล์เหล่านี้ให้เรียกใช้คำสั่ง Python3 ต่อไปนี้จากตำแหน่งโฟลเดอร์ src :
>>> from samples_generation import replace_ast
>>> replace_ast('../example/Benign-example/example.js', '../example/Malicious-seed/seed.js')
คุณจะได้รับผลลัพธ์ต่อไปนี้ใน stdout:
INFO:Successfully selected 2 clones in XXXs
==============
[<node.Node object at XXX>, <node.Node object at XXX>]
obj.setAttribute('type', 'application/x-shockwave-flash');
obj = document.createElement('object');
[<node.Node object at XXX>, <node.Node object at XXX>]
wscript.run('cmd.exe /c "<malicious powershell>;"', '0');
wscript = WScript.CreateObject('WScript.Shell');
--
[<node.Node object at XXX>, <node.Node object at XXX>]
obj.setAttribute('tabindex', '-1');
obj = document.createElement('object');
[<node.Node object at XXX>, <node.Node object at XXX>]
wscript.run('cmd.exe /c "<malicious powershell>;"', '0');
wscript = WScript.CreateObject('WScript.Shell');
--
==============
INFO:Could find 100.0% of the malicious nodes in the benign AST
เครื่องมือของเราพบ 2 โคลน (แต่ละครั้งประกอบด้วย 2 ข้อความ) หมายความว่าเมล็ดพันธุ์ที่เป็นอันตรายทั้งหมดสามารถเขียนใหม่ได้ใน 2 วิธีที่แตกต่างกันในตัวอย่างที่อ่อนโยน
นอกจากนี้ example/Malicious-seed/seed-analysis/example_seed.json ซึ่งมีข้อมูลโคลนเพิ่มเติมถูกสร้างขึ้น
หากคุณใช้ Hidenoseek สำหรับการวิจัยเชิงวิชาการคุณได้รับการสนับสนุนอย่างมากในการอ้างอิงบทความต่อไปนี้:
@inproceedings{fass2019hidenoseek,
author="Fass, Aurore and Backes, Michael and Stock, Ben",
title="{textsc{HideNoSeek}: Camouflaging Malicious JavaScript in Benign ASTs}",
booktitle="ACM CCS",
year="2019"
}
ในสนามมัลแวร์ระบบที่ใช้การเรียนรู้ได้รับความนิยมในการตรวจจับตัวแปรที่เป็นอันตรายใหม่ อย่างไรก็ตามผู้โจมตีที่มีความรู้ เฉพาะ และ ภายใน ของระบบเป้าหมายอาจสามารถสร้างตัวอย่างอินพุตที่ถูกจัดประเภทได้ ในทางปฏิบัติสมมติฐานของ ผู้โจมตีที่แข็งแกร่ง ไม่สมจริงเพราะมันหมายถึงการเข้าถึงข้อมูลภายใน เราเสนอให้ Hidenoseek การโจมตีลายพรางนวนิยายและทั่วไปซึ่งหลีกเลี่ยงเครื่องตรวจจับทั้งหมดตามคุณสมบัติทางไวยากรณ์โดยไม่จำเป็นต้องใช้ข้อมูลใด ๆ เกี่ยวกับระบบที่พยายามหลบเลี่ยง การโจมตีของเราประกอบด้วยการเปลี่ยนโครงสร้างของตัวอย่าง JavaScript ที่เป็นอันตรายเพื่อทำซ้ำไวยากรณ์ที่อ่อนโยน
เพื่อจุดประสงค์นี้เราจะเขียนต้นไม้ไวยากรณ์นามธรรมใหม่โดยอัตโนมัติ (ASTs) ของอินพุตจาวาสคริปต์ที่เป็นอันตรายลงในต้นไม้ที่มีอยู่ในปัจจุบัน โดยเฉพาะอย่างยิ่ง Hidenoseek ใช้เมล็ดพันธุ์ที่เป็นอันตรายและค้นหากราฟย่อย isomorphic ระหว่างเมล็ดและสคริปต์ที่อ่อนโยนแบบดั้งเดิม โดยเฉพาะอย่างยิ่งมันแทนที่การแสดงย่อยที่เป็นพิษเป็นภัยโดยเทียบเท่าที่เป็นอันตรายของพวกเขา (โครงสร้างไวยากรณ์เดียวกัน) และปรับการพึ่งพาข้อมูลที่เป็นพิษเป็นภัย-โดยไม่ต้องเปลี่ยน AST-เพื่อให้ความหมายที่เป็นอันตรายถูกเก็บไว้ ในทางปฏิบัติเราใช้ประโยชน์จาก 23 เมล็ดที่เป็นอันตรายเพื่อสร้างสคริปต์ที่เป็นอันตราย 91,020 สคริปต์ซึ่งทำซ้ำ Asts ของ Alexa Top 10,000 หน้าเว็บได้อย่างสมบูรณ์แบบ นอกจากนี้เราสามารถผลิตตัวอย่างที่เป็นอันตรายได้โดยเฉลี่ย 14 ตัวอย่างที่มี AST เดียวกันกับ Alexa Top 10
โดยรวมแล้วตัวจําแนกที่ผ่านการฝึกอบรมมาตรฐานมีเชิงลบที่ผิดพลาด 99.98% กับอินพุต Hidenoseek ในขณะที่ตัวจําแนกที่ผ่านการฝึกอบรมเกี่ยวกับตัวอย่างดังกล่าวมีผลบวกเท็จมากกว่า 88.74% ทำให้เครื่องตรวจจับแบบคงที่เป้าหมายไม่น่าเชื่อถือ
โครงการนี้ได้รับใบอนุญาตภายใต้ข้อกำหนดของใบอนุญาต AGPL3 ซึ่งคุณสามารถค้นหาได้ใน LICENSE