Аннотация: В работе исследуются проблемные вопросы в защите информационных систем и предлагаются методы устранения этих проблем. Целью является улучшение систем защиты компьютерной информации от скриптовых вирусов, которые попадают к компьютеру из сети интернет, а именно при просмотре WEB-страниц с встроенным вирусным программным обеспечением. Описаны принципы создания и построены алгоритмы противодействия обфусцированим скриптовым вирусам.
Ключевые слова: Обфускация, Деобфускация, Расшифровка, WEB-страницы, JavaScript, скриптовый вирус.
Технічні науки
УДК 004.735
Унгул Володимир Валерійович
студент
Національний технічний університет України
«Київський політехнічний інститут»
Унгул Владимир Валерьевич
студент
Национальный технический университет Украины
«Киевский политехнический институт»
Unhul Volodymyr V.
Student
АНАЛІЗ ТА РОЗРОБКА МЕТОДІВ ДЕОБФУСКАЦІЇ СКРИПТІВ ДЛЯ ВИЯВЛЕННЯ ЗАГРОЗ ІНФОРМАЦІЙНОЇ СТІЙКОСТІ КОМП’ЮТЕРА
АНАЛИЗ И РАЗРАБОТКА МЕТОДОВ ДЕОБФУСКАЦИИ СКРИПТОВ ДЛЯ ВЫЯВЛЕНИЯ УГРОЗ ИНФОРМАЦИОННОЙ УСТОЙЧИВОСТИ КОМПЬЮТЕРА
ANALYSIS AND DEVELOPMENT OF METHODS DEOBFUSKATSIYI SCRIPTS TO IDENTIFY THREATS TO INFORMATION COMPUTER SUSTAINABILITY
Анотація: В роботі досліджуються проблемні питання в захисті інформаційних систем та пропонуються методи усунення цих проблем. Метою є покращення систем захисту комп’ютерної інформації від скриптових вірусів, які потрапляють до комп’ютера з мережі інтернет, а саме при перегляді WEB-сторінок із вбудованим вірусним програмним забезпеченням. Описани принципи створення та побудовані алгоритми протидії обфусцированим скриптовим вірусам.
Ключові слова: Обфускація, Деобфускація, Розшифровування, WEB-сторінки, JavaScript, скриптовий вірус.
Аннотация: В работе исследуются проблемные вопросы в защите информационных систем и предлагаются методы устранения этих проблем. Целью является улучшение систем защиты компьютерной информации от скриптовых вирусов, которые попадают к компьютеру из сети интернет, а именно при просмотре WEB-страниц с встроенным вирусным программным обеспечением. Описаны принципы создания и построены алгоритмы противодействия обфусцированим скриптовым вирусам.
Ключевые слова: Обфускация, Деобфускация, Расшифровка, WEB-страницы, JavaScript, скриптовый вирус.
Summary : It analyzes the problems in protecting information systems and proposes methods eliminate these problems. To improve the systems of information protection of scripting viruses that enter your computer from the Internet, such as when watching WEB-page in-viral software. Describes the creation and counter the algorithm obfustsyrovanym scripting viruses.
Key words: Obfuskatsiya, Deobfuskatsiya, Decryption, WEB-page, JavaScript, script virus.
Вступ
З кожним днем зростає кількість інформаційних комп’ютерних систем, які потребують захисту, надійності в обробці й використанні даних, разом із ними зростає кількість різновидів вірусів та вірусного коду, які можуть негативно вплинути або взагалі внести критичні зміни в роботу будь-якої інформаційної системи. В процесі виконання наукового дослідження винайдені та представлені принципово нові рішення по захисту інформаційної системи від зашифрованих скриптових комп’ютерних вірусів.
1. АНАЛІЗ ТА ОГЛЯД ПРОБЛЕМАТИКИ ПРЕДМЕТНОЇ ОБЛАСТІ ДОСЛІДЖЕННЯ
В зв’язку з тим, що проблеми протидії зашифрованим скриптовим вірусам є досить новою, в науково-практичних джерелах є деяка розбіжність в термінології та поняттях. Тому на першому етапі досліджень проведена гармонізація понятійної бази.
Гармонізація базувалась на наступних принципах:
- Використані поняття та терміни повинні відповідати загальновизнаним та не протирічити між собою.
- Використані поняття та терміни повинні відповідати меті дослідження.
В даній статті особлива увага приділяється обфускації програмного коду та веб-додатків написаних на скриптовій мові javascript. Обфускація – це приведення виконуваного програмного коду до виду, який зберігає його функціональність, але ускладнює аналіз, розуміння алгоритму роботи і модифікації при декомпіляції [1]. Іншими словами це заплутування коду. «Заплутування» коду може здійснюватися на рівні алгоритму, сирцевого тексту або асемблерного тексту. Існують спеціальні програми, що виробляють обфускацію, їх називають обфускаторами. Є деяка кількість шляхів обфускації, яка може реорганізовувати програмний код в автоматичному режимі або в ручному.
Цілі обфускації:
- Ускладнення декомпіляції та вивчення програм з метою виявлення функціональності;
- Ускладнення декомпіляції програм з метою запобігання обходу систем перевірки ліцензій;
- Порушення авторських прав програмістів і приховування авторства;
- Демонстрація неочевидних можливостей мови і кваліфікації програміста.
Останнім часом, в інтернет середовищі значно поширилась тенденція написання шкідливого коду і прихованість його за допомогою методів обфускації. Такі вірусні програми та скрипти легко обходять існуючі антивірусні засоби, тому що виявити шкідливий функціонал досить складно. Щоб дослідити такий код треба проводити деобфускацію. В деяких випадках її треба робити в декілька кроків, тому що код може бути обфусцированим декілька разів. Тобто вже обфусцирований код піддається новій обфускації і так далі.
Деобфускація – це процес, приведення обфусцированого коду до виду, який дозволить вивчати та анлізувати його функціонал. В даний момент часу, не має систем, які б змогли проаналізувати будь-який обфусцирований код, але існують деобфускатори (програми, які надають змогу проаналізувати функціонал або привести код до зрозумілого виду), які «заточені» тільки під певний різновид обфускації. Метою дослідження є можливість аналізувати будь-який обфусцирований код, назважаючи, якими засобами та методами він був обфусцирован.
Існує дуже велика кількість методів обфускації, яких із кожним днем стає дедалі більше. Ми спробували їх розділити на три категорії.
Існують готові програмні засоби, які надають змогу в автоматичному режим зробити «зтискання» коду. Таким видом обфускації користуються в більшій мірі виробники програмного забезпечення. Код, який отримаємо на виході, можна зашифрувати ще одним методом, які будуть розглянуті пізніше в нашій роботі.
Серед загальновідомих мінімізаторів [2] можна виділити JS Packer, JSmin, YUI Compressor, Closure compiler та це далеко не повний їх список.
Написаний код на скриптовій мові JavaScipt виду:
function MyClass(){
this.foo = function(argument1, argument2){
var addedArgs = parseInt(argument1)+parseInt(argument2);
return addedArgs;
}
var anonymousInnerFunction = function(){
// do stuff here!
}
}
За допомогою мінімізаторів приймає такий вигляд:
function MyClass(){this.foo=function(c,b){var d=parseInt(c)+parseInt(b);return d};var a=function(){}};
або такий:
var _0xd799=["\x66\x6F\x6F"];function MyClass(){this[_0xd799[0]]=function (_0xefcax2,_0xefcax3){var _0xefcax4=parseInt(_0xefcax2)+parseInt(_0xefcax3);return _0xefcax4;} ;var _0xefcax5=function (){} ;} ;
або такий:
eval(function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--){d[c]=k[c]||c}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('4 0="3 5!";9 2(1){6(1+"\\7"+0)}2("8");',10,10,'a|msg|MsgBox|Hello|var|World|alert|n|OK|function'.split('|'),0,{})).
З першого погляду отриманий код важко проаналізувати та все ж таки не існує нічого неможливого. Подібну обфускацію можно провести і в ручному режимі, що, можливо, навість ускладнить його деобфускацію.
Такий підхід перетворює код до невпізнання [3]. Навіть незрозуміло, що перед нами виконуваний JavaScript скрипт.
Мізерний скрипт alert(0) можна перетворити в такий вид:
([][(![]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]()[(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]])(+[]);
або в такий:
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');
де взагалі використовуються символи, яких немає навіть на розкладці клавіатури. Хоча з першого погляду все виглядає досить страшно та здебільшого до такого виду можна привести в автоматичному режимі. Існує деяка кількість Braifuck-подібних конверторів для JavaScript.
До даного виду обфускації також можна віднести написання коду на езотеричних мовах програмування таких як Whitespace, JAPH та інших.
В першому способі на виході ми отримували код схожий на JavaScirpt, у другому зовсім не схожий, а метод запечатування його робить взагалі прихованим.
Обфусцирований код буде складатися з двох частин: видима частина (може використовуватися будь-який спосіб із вищеперерахованих для її обфускації) і прихована частина.
Реалізовується це таким чином: «Шкідливий код», який ми хочемо сховати, перетворюється на строку, яка складається зі знаків табуляції (біт 1) та пробілів (бит 0). Як результат, ми отримуємо в багато разів більше коду, ніж у нас було. Видима частина буде декодувати приховану частину та її виконувати: декодуватиме біти в числа, а числа перетворить в символ String.fromCharCode(), а далі виконає функцію eval. Приклад:
decodeAndEval(document.getElementById("evilCode").innerHTML);
<div id="evilCode">
</div>
До цього методу обфускації коду можна також віднести пакування скрипта JavaScript в CSS [4]. На сторінці користувача буде відображатися картинка, яка може бути навіть фоновою, але при виконанні коду нашкодить вашому комп’ютеру. Такий спосіб шифровки реалізовується таким чином: відбувається зтискання коду та з’являється можливість реалізації інтелектуальних систем відновлення зображень винятково на растровій мові. Вказуючи просторове положення такого зображення-коду, ми можемо формувати дуже інтересні структуровані по принципу нарізання (tilling) бібліотеки практично безграничного розміру, високо-оптимізовані по трафіку та часу доступу до конкретної ділянки коду (рис. 1.1).
Рисунок 1.1 Приклад запечатаного скрипта в зображення
1.2.4 Узагальнена структурна схема шляхів обфускації
Із вище продемонстрованих та описаних категорій обфускації скриптів можна побудувати узагальнену структурну схему шляхів обфускації, яка зображена на рис. 1.2.
Рисунок 1.2 Узагальнена структурна схема шляхів обфускаціїї
2. РОЗРОБКА МЕТОДІВ ДЕОБФУСКАЦІЇ JAVASCRIPT
Аналіз літературних джерел не виявив завершеного алгоритму деобфускації зашифрованого коду JavaScript. Знайдено тільки характерні приклади деобфускації. Тому на основі ідеї розшифровування скриптів та деяких запропонованих шляхів аналізу обфусцированого коду запропонуємо деякі методи дуобфускації JavaScript.
Для даного методу деобфускації розроблено наступний алгоритм, який зображено на рис. 3.1.
- Якщо результатом деобфускації є код, в якому ми можемо проаналізувати функціонал, тобто ключеві слова, які визивають деякі функції, то переходимо до оцінки безпечності такого коду.
- Якщо результатом деобфускації є код, в якому проаналізувати функціонал не вдається, то треба перейти до попереднього методу деобфускації JavaScript, який було розглянуто в 2.1. Такий підхід демонструє, що обфускація була проведена у декілька кроків, де спочатку скористалися методом мінімізації, а потім методом приведення коду до Braifuck-подібного вигляду.
Для даного методу деобфускації розроблено наступний алгоритм, який зображено на рис. 3.2.
Для даного методу деобфускації розроблено наступний алгоритм, який зображено на рис. 3.3.
Рисунок 3.1 Алгоритм деобфускаціїї зашифрованих скриптів мінімізаторами
Рисунок 3.2 Алгоритм деобфускаціїї зашифрованих скриптів Braifuck-подібного виду
Рисунок 3.3 Алгоритм деобфускаціїї зашифрованих скриптів методом запечатування
Висновки
Представлені алгоритми та методи деобфускації скриптів рекомендовано використовувати в програмному забезпеченні інтегрованому із браузерами, для того щоб виявляти вірусну активність на WEB-ресурсах в режимі онлайн. Звісно дані алгоритми потребують деякої модифікації для більш результативної роботи при їх впровадженні, але представлена ідея класифікації обфусцированого коду по категоріях є досить новою і надає можливість розробити універсальні підходи до аналізування та розшифровування скриптів.
Література
1.Терейковський І. Нейронні мережі в засобах захисту комп’ютерної інформації / І. Терейковський. - К. : ПоліграфКонсалтинг. - 2007. – 198 с.
2.“Badass JavaScript”: інтернет блог, стаття: “Badass js is back white some badass obfuscation” – посилання: http://badassjs.com/post/2929065287/obfuscation/
3.“Adamcecc”: інтернет блог - посилання: http://adamcecc.blogspot.com/
4.“Ajaxian”: інтернет сайт, стаття “Want to pack JS and CSS really well? Convert it to a PNG and unpack it via Canvas”, посилання: http://ajaxian.com/
5.Безруков Н. Н. Компьютерная вирусология / Н. Н. Безруков. -
К. Инкомбук, 1990. - 450 с.
6.Біленчук П.Д. Комп'ютерна злочинність / П. Д. Біленчук,
Б. В. Романюк. - К. : Атака, 2002. - 240 с.
7.Вилков А.С. Информационная безопасность персональных ЭВМ и мониторинг компьютерных сетей / А.С. Вилков. – М. : МИНИТ ФСБ России, 2005. – 210 с.