หากใครเคยคุ้นชินเรื่อง IDS/IPS (Intrusion Detection System/Intrusion Prevention System) ซึ่งเป็นระบบในการตรวจจับการโจมตี รวมถึงการใช้งานที่ผิดปกติต่างๆ สิ่งที่เครื่องมือเหล่านี้ใช้เพื่อตรวจจับเป็นด่านแรกคือ Signature นั่นเอง โดย IDS/IPS ที่เป็น Open Source ที่ได้รับความนิยมคือ Snort ซึ่งเราสามารถเขียน Signature ขึ้นมาเพื่อป้องกันหรือดักจับพฤติกรรมใดๆได้เอง แต่ Signature ดังกล่าวเป็นอะไรที่ซับซ้อนและเน้นเรื่อง traffic Rule เป็นหลัก จึงได้มีการคิด Rule ที่ซับซ้อนน้อยลงและใช้สำหรับการค้นหาไฟล์ที่มีลักษณะเป็น malware ตาม Indicator of Compromise (IoC) และมีความทรงประสิทธิภาพนั่นคือ Yara Rule นั่นเอง

Yara Rule เป็น Signature สำหรับการหา”ไฟล์”ที่ตรงกับที่เรากำหนด โดยเราสามารถกำหนด “เงื่อนไข” (Condition) ด้วยลักษณะต่างๆของไฟล์ ไม่ว่าจะเป็น MD5, string, Hex String, ขนาดของไฟล์ โดยเราสามารถเขียน Yara Rule แล้วสามารถนำไปใช้งานในเครื่องมือป้องกันระดับ Enterprise มากมายไม่ว่าจะเป็น FireEye, CarbonBlack, Checkpoint,etc รวมถึงใน Antivirus เองก็เริ่มมีการนำ Yara Rule ไปใช้แล้วอย่าง ClamAV เป็นต้น อีกทั้งเราสามารถเขียน Yara Rule ทีเดียวแล้วนำไปในในระบบปฎิบัติการที่แตกต่างกันอีกด้วย ไม่ว่าจะเป็น Windows, Linux, MacOS เองก็ตาม โดยไม่ต้องพึ่ง Engine ใดๆนอกเหนือจาก Yara binary อีกด้วย

หากถามว่า Yara Rule นั้นเหมาะกับการใช้งานแบบใด ให้เรามองเรื่องของการใช้งาน ณ​ ปัจจุบันของเราเป็นหลักก่อนดีกว่า เนื่องด้วยการใช้งานเครือข่าย internet ส่วนใหญ่นั้นมีการเข้ารหัส traffic ซะส่วนใหญ่ทำให้การโอนถ่ายไฟล์ระดับ network นั้นยากที่จะอ่านได้ ซึ่งส่งผลให้เกิดการ bypass Network Security perimeter  เข้ามาได้ง่าย ก็กลายเป็นว่าต้องไปพึ่งที่ Endpoint Protection อย่าง Antivirus หรือ APT Solution ซะส่วนใหญ่ที่จะคอยจัดการกับไฟล์ที่ผิดปกติ ซึ่งแน่นอนว่าใช่ว่าการป้องกันระดับ Endpoint (Client) นั้นจะรวดเร็วซะทีเดียว ในบางครั้ง Solution เหล่านั้นก็ไม่สามารถ update Signature ของการป้องกัน Malicious file ไม่ทัน(ทำไมถึงไม่ทันลองอ่านบทความตาม link นี้ดูครับ) ดังนั้นหากเรามี SoC (Security Operation Center) ที่มีประสิทธิภาพมากพอ เราสามารถให้ SoC Engineer สามารถวิเคราะห์ malicious file ได้เบื้องต้น โดยดูจากลักษณะของไฟล์ แล้วเขียน Yara Rule ขึ้นมาเพื่อใช้ในการป้องกันหน่วยงานของเราก่อนที่ Vendor แต่ละเจ้าจะทำ signature ขึ้นมาป้องกันไฟล์เหล่านั้นก็สามารถทำได้เช่นกันครับ

เกริ่นนำมาก็ยาวแล้ว มาเริ่มกันเลยดีกว่าว่า Yara Rule สามารถติดตั้งและใช้งานได้อย่างไรครับ

วิธีการติดตั้ง Yara Rule ใน Ubuntu 16.04 

1. Update list จาก Repository จากนั้นติดตั้ง Yara

วิธีการติดตั้ง Yara Rule ใน Windows 10

หากเป็น Windows ให้ download Yara Binary มาติดตั้งได้เลยครับ

วิธีการเขียน Yara Rule

Yara Rule เขียนโดยอิงจากการเขียน Regular Expression โดยจะมี syntax ประมาณด้านล่างนี้

strings: จะหมายถึงสิ่งที่เป็นลักษณะของไฟล์ที่เราต้องการค้นหา โดยจากตัวอย่างจะมี 2 ลักษณะคือ: $test_string1 และ $test_string2 โดย $test_string1 หมายถึงหา string คำว่า “Testing” ใน file ใดๆ และ $test_string2 หา hex string ของไฟล์ที่มี “E1 D2 C3 B4” อยู่ในไฟล์

Condition: เป็นการกำหนดลักษณะของเงื่อนไขการค้นหา จากตัวอย่างจะเป็น หากพบ test_string1 หรือ test_string2 ให้ทำการแสดงชื่อไฟล์ออกมา

เมื่อเราเขียนเรียบร้อยแล้วสามารถเรียกใช้งานได้โดยใช้คำสั่งเป็น

โดยในที่นี้ผมลองสร้างไฟล์ test.txt ที่มีคำว่า Hello World อยู่ข้างใน จากนั้นสร้าง Rule เป็น

จากนั้นใช้คำสั่งเป็น

หากว่าตรงกับ Rule ที่ตั้งไว้ มันจะทำการแสดงผลเป็น ชื่อ Rule และตามด้วยชื่อไฟล์

Strings

โดยวิธีการเขียน strings ของ Yara สามารถทำได้หลายอย่างดังนี้

– Hexadecimal strings เป็นการหา Byte ที่มันติดๆกัน โดยมีการกำหนดการหาได้อย่าง flexible แทนตัวที่เราไม่รู้หรืออยากจะข้ามการเช็คไป

– Wildcard เป็นการกำหนดว่าตำแหน่งนั้นเป็นอะไรก็ได้ เช่น

หมายถึงการ match byte ใดๆที่เป็น E2, 34, ตามด้วย hex string ใดๆก็ได้ 2 ตัว, C8, Aแล้วตามด้วยอะไรก็ได้ 1 ตัว, FB ซึ่งจะทำให้ match byte อย่าง E2, 34, FF,C8, A1, FB เป็นต้น

– Jump เป็นการกำหนดให้ข้ามการตรวจสอบไปตามจำนวนที่กำหนด เช่น

หมายถึงการ match byte ใดๆที่เป็น F4, 23, แล้ว byte ใดๆก็ได้ 4-6 byte, 62, B4 ดังนั้น Rule นี้จะ match ดังนี้

– กำหนดใช้ | ข้างในเพื่อให้เป็นการ match byte ทั้งหมดที่ต้องการเช่น

หมายถึงการสร้าง rule ให้ match กับ F4,23, ตามด้วย 62 และ B4 หรือตามด้วย 56, 45 ดังนั้น Rule นี้จะ match byte ที่เป็น F42362B445 หรือไม่ก็ F4235645 นั่นเอง

– String เป็นการหาไฟล์ใดๆที่มี ASCII string อยู่ในไฟล์ ตามที่เป็นตัวอย่างไปตอนแรกสุด โดยจะมีตัวอักษรพิเศษตามนี้

เราสามารถกำหนดให้มีการตรวจสอบ string แบบไม่ case sensitive ได้โดยกำหนด option เป็น nocase เพิ่มเติม

เราสามารถกำหนดการหาการ string จากไฟล์ที่มีเนื้อหาเป็น encode ที่เป็น 2 byte ได้โดยใช้ wide option (เช่นพวก UTF-16 เป็นต้น)

หากเราต้องการหาทั้ง encode และ ASCII ให้เพิ่ม option ascii เข้าไปเพิ่มด้วย

หากต้องการหาคำโดยเฉพาะจะใช้คำว่า fullword เช่น

สิ่งที่มันจะ match คือ www.domain.com, www.my-domain.com แต่จะไม่ match กับ www.mydomain.com นั่นเอง

– Regular Expression (Regex)

เราสามารถใช้ Regex ในการหา string ใดๆได้

โดย Regex ทั่วไปที่จำเป็นต้องทราบมีดังนี้

Condition

– เราสามารถกำหนดเงื่อนไขตามลักษณะของภาษาทั่วได้ นั่นคือการใช้ OR, AND, NOT และ condition เชิงเปรียบเทียบอย่าง >=, <=, <, >, ==, != รวมถึงการกำหนดเงื่อนไขเชิงคณิตศาสตร์ (+, -, *, \, %) ด้วย

เราสามารถเปลี่ยน string กลายเป็น couting of string (จำนวนที่พบ string) ได้โดยเปลี่ยนจาก $ ให้กลายเป็น #

เราสามารถกำหนดการหาว่าเป็นตำแหน่งใด(offset) ได้โดยใช้คำสั่ง at

หากต้องการหาตำแหน่งใน range ที่กำหนดจะใช้เป็น in

หากกำหนดหาไฟล์ที่มีขนาดตามที่ต้องการจะใช้เป็น filesize

หากกำหนดเงื่อนไขให้เป็น set ของการตรวจสอบจะเป็น of

จาก Rule ความหมายคือในไฟล์ต้องมี 2 string จาก 3 ตัวที่กำหนด อีกทั้งยังกำหนด condition ของ of ได้ในหลายๆความหมายอีกด้วย

การกำหนด Tag และ Metadata ใน Yara

นอกจากนี้เรายังสามารถที่จะใส่ tag ให้กับ rule ได้โดยใช้เป็น

และหากเราต้องการใส่ Metadata เข้าไปใน Rule สามารถเขียนได้เป็น

ซึ่ง Metadata เป็นสิ่งที่เราจะใส่ข้อมูลเข้าไปเอง ไม่ว่าจะเป็น author, severity, Link และอื่นๆ

การใช้ module ใน Yara Rule

– PE Module

เราสามารถใช้ module PE เพื่อทำการตรวจสอบ execution อย่าง Portable Executable (PE) ได้ โดยมีลักษณะการตรวจสอบมากมาย

สามารถตรวจสอบ condition รวมถึง string ต่างๆของ module ต่างๆของ PE ได้ตาม LINK นี้

– ELF Module

เราสามารถใช้ module ELF เพื่อทำการตรวจสอบ execution อย่าง ELF ซึ่งเป็น file run ใน Linux ได้ โดยมีลักษณะการตรวจสอบมากมาย

สามารถตรวจสอบ condition รวมถึง string ต่างๆของ module ต่างๆของ ELF ได้ตาม LINK นี้

– Cuckoo Module

เป็นการใช้งาน Yara ผสมผสานกับ Report ของ Yara Rule โดย syntax การใช้งานร่วมกันจะเป็น

ซึ่ง behavior_report_file จะเป็นพฤติกรรมที่เราได้จากการตรวจสอบผ่าน cuckoo โดยตัวอย่างของ Rule ไฟล์จะเป็น

นั่นหมายความว่าหากไฟล์มี hex string { 01 02 03 04 05 06 } และมีพฤติกรรมการติดต่อไปยัง http://someone.doingevil.com

หากเราใช้ร่วมกับ python จะได้เป็น

– Magic Module

เป็นการตรวจสอบชนิดของไฟล์ ซึ่งเหมือนกับการใช้คำสั่ง file ใน Linux นั่นเอง โดยมี 2 แบบคือ type() และ mime_type()

– Hash Module

Hash module เอาไว้สำหรับการสร้าง rule เพื่อคำนวณและตรวจสอบค่า hash ของไฟล์ใดๆ โดยสามารถทำได้ทั้ง MD5, SHA1,SHA256 รวมถึงการคำนวณ checksum() ก็สามารถทำได้เช่นกัน

สามารถตรวจสอบ  Module อื่นๆได้ที่ Link นี้ครับ

ตัวอย่าง Rule สำหรับตรวจจับ WannaCry จาก FireEye

Mac Malware YaraRule

ใช้งาน Yara Rule ไปเป็น Antivirus

Source::