Code injection

**Code injection /Кодын тарилга** нь хүчингүй мэдээллийн боловсруулалт хийснээс шалтгаалан компьютерийн алдааг ашиглах явдал юм. Халдагчид injection-ийн кодыг эмзэг компьютерийн програмд нэвтрүүлж, гүйцэтгэх явцыг өөрчилдөг. Хэрвээ **code injection** амжилттай ажиллавал гамшгийн хэмжээний үр дагаварт хүргэнэ.

**Code injection**-ийн эмзэг байдал (тарилгын алдаа) нь итгэмжлэгдээгүй өгөгдлийн мэдээллийг програм өөрөө програмын гүйцэтгэгчид илгээх үед тохиолддог. **Code injection**-ийн алдаа нь ихэнхдээ SQL, LDAP, XPath эсвэл NoSQL кюэригээр олддог. Жишээ нь OS командууд; XML параметрүүд, SMTP толгойнууд, програмын нэмэлт өгөгдлүүд гэх мэт. Тарилгын алдааг илэрүүлэх нь эх кодыг шалгах замаар хайхаас илүүтэйгээр хялбар байх хандлагатай. Сканнер болон флешер нь тарилгын гэмтэл олоход тусалдаг.

**Injection** нь өгөгдлийн алдагдал, хариуцлагын дутмаг байдал, эсвэл мэдээллийн сандаа хандах эрхгүй болох зэрэг үр дүнд хүргэнэ. **Injection **нь заримдаа дахин хост худалдан авалт хийхэд хүргэдэг.

Тодорхой төрлийн code injection нь хэрэглэгчийн утга өгч нэвтрэх хэсэг дээр тусгай утгатай оролт оруулж алдаа үүсгэж кодыг тайлал үүсгэдэг. Үүнтэй төстэй алдааны тайллууд нь компьютерийн шинжлэх ухааны ертөнцөөс гадуур энд “Хэн хамгийн эхэнд бэ?” гэдэг улиг болсон арга ашигладаг. Энэ арга нь нэрийг нь тогтмол үгээр ялгаж чаддаггүй. Өөрөөр хэлбэл code injection нь зарим төрөлд системийн хэрэглэгчийн оролтыг системийн командаас ялгаж чаддаггүй.

**Code injection** – ийн аргуудыг системийг хакердах эсвэл системийг эвдэж, зөвшөөрөлгүй нэвтэрж мэдээллээс ашиг олоход ихээхэн ашигладаг. Code injection – ийг муу санааны үүднээс маш олон төрлийн зорилгоор ашигллаж болно. Үүнд: 
* SQL injection ашиглан өгөгдөлд утгыг дур мэдэн өөрчилж болно. Үүний үр нөлөөнөөс болж вэбсайтыг нурааж, мэдрэмтгий өгөгдлийг ноцтойгоор зөрчдөг.
* Сервер дээр вирус суулгах эсвэл хорлонтой кодыг ажиллуулсанаар сервер талын сктрипт кодыг (PHP эсвэл ASP гэх мэт) injection хийдэг.
* Windows дээрх үйлчилгээг ашиглан НС UNIX-ийн setuid root хоёртын файл дотор Shell Injection эмзэг байдлыг ашиглах замаар root зөвшөөрлийг нэмэгдүүлнэ.
* HTML / Script Injection (Cross-site scripting) ашиглаж вэб хэрэглэгчдрүү довтлох.
Code Injection ашигласан халдлагыг 2008 онд хамгийн их ашигласан жил бөгөөд тухайн жилдээ нийт халдлагын 5,66% нь code injection байжээ. 2015 он гэхэд энэ тоо 0.77% болж буурчээ.

## Хоргүй болон санамсаргүй ашиглалт
Code injection – ийг сайн талаар нь ашиглаж болно. Жишээлвэл: code injection-аар системд ямар нэгэн хор хөнөөлгүйгээр програм болон системийн төлөвийг өөрчлөх мөн хуурч чадна. Жишээлбэл, code injection нь:
* Хайлтын үр дүнд үндсэн загвар дээр харагддаггүй шинэ баганыг харуулах
* Үндсэн зохиомж дээр байхгүй өгөдлийг хайх, бүлэглэх, эрэмблэх функцыг шинээр санал болгох
* Dropbox зэрэг програмуудын хувьд онлайн нөөцүүдийг ашиглан офлайн програмаар холбогдож болох тусгай хэсгийг нэмнэ
* Линуксийн Динамик холбогчийг ашиглахын тулд тодорхой libc функцуудтай адил нэртэй функцийг тодорхойлох, тэр функцээ сангаар нь ашиглах, libc функцийн хэрэглээг дарж тодорхойлох боломжтой.

## Асуудлаас урьдчилан сэргийлэх
**Code injection** үүсэх асуудлаас урьдчилан сэргийлэхийн тулд аюулгүй оролт, гаралтын харьцуулалтыг ашиглах хэрэгтэй. Жишээлбэл:
* API ашиглсанаар бүх оролтийн тэмдэгтүүдийг найдвартай бологдог. Параметржүүлсэн queries буюу ("Бэлтгэсэн query", "бэлтгэсэн тайлан", "холбогдох хувьсагчууд") нь хэрэглэгчийн өгөгдлийг тодорхойлогдсон тэмдэгт мөрөөс гадагш зөөхийг зөшөөрдөг. Мөн, шалгуур API болон үүнтэй төстэй API нь оролтон дэхь коммандийг ажиллуулах бий болгох, задлахаас зайлсхийдэг.
* Статиз төрлийн системээр хэлийг тусгаарлахыг шаарддаг.
* Оролтын шалгалт, whitelisting буюу энэ нь зөхөн боломжтой утгуудыг танидаг байх, энэ нь хэрэглэгчийн тал дээр javascript ашиглан хийгдэж болно, Сервэр талд энэхүү үйлдлийг хийвэл илүү найдвартай болно.
* Оролтын нууцлал, аюултай тэмдэгтүүдээс зайлс хийх. Php-д htmlspecialchars() гэсэн функцийг ашиглан HTML дээр аюулгүй гаралт хийдэг, мөн mysqli::real_escape_string() нь sql хүсэлт дэхь өгөдлийг sql injection аас тусгаарладаг.
* Гаралтын нууцлал, веб хэрэглэгчдээс HTML Injection (XSS) халдлагийг урьдчиалан сэргийлэх
* HttpOnly нь HTTP Cookies-ийг тэмдэглэдэг бөгөөд тогтоосон үед хэрэглэгчийн талын script үүд нь cookie-тэй харилцах боломжийг олгодоггүй бөгөөд ингэснээр тодорхой XSS халдлагаас сэргийлдэг.
* Kernel-ээс модульчлагдсан бүрхүүлийн задаргаа
* SQL Injection ашиглан параметржүүлэлтийн query ууд, stored procedure ууд, whitelist оролтын баталгаажуулалт, кодчилолын асуудлуудыг багасгахад туслах болно.

Дээрх шийдлүүд нь HTML болон сервер талын програмын script кодын injection голдуу вэб дээр суурилсан байна. Бусад аргуудыг заавал ашиглах хэрэгтэй тэгэхгүй бол хэрэглэгчийн машин дээр хэрэглэгчийн код тараах үед давуу эрх дээшилсэн халдлагад үүсдэг. Удирдлагатай болон удирдлаггүй кодын injection-уудийг илрүүлэх, тусгаарлах зарим аргууд нь:
* Runtime image hash validation - санах ойд ачаалагдсан ажиллах боломжтой complete image эсвэл hash-ийн хэсгийг авч, хадгалагдсан болон хүлээгдэж байгаа hash-тай харьцуулдаг.
* NX бит - хэрэглэгчийн бүх өгөгдлүүд нь ажилуулах боломжгүй гэж тэмдэглэгдсэн тусгай санах ойн хэсгүүдэд хадгалагддаг. Процессор нь тухайн санах ойд код байхгүй ба тэнд байгаа зүйлийг ажиллуулахаас татгалздаг.
* Canaries – стакт утгуудаа санамсаргүйгээр байрлуулдаг. Ажиллаж байх үед, функц буцаж ирэхэд канарий шалгана. Канар нь өөрчилсөн бол програм нь ажиллагаа болон гарцаа зогсоодог. Энэ нь Stack Overflow Attack дээр тохиолддог.
* [C хэл дээр] Code Pointer Masking (CPM) – register дэхь кодын заагчийг уншссаны дараа bitmask – ийг заагч руу оруулдаг.

## Жишээнүүд
### SQL injection
**SQL тарилга** нь SQL-ийн өгөгдлийн санг унших, өөрчлөх боломжтой командуудыг тарих, эсвэл анхны хайлтын утга учрыг эвдэх синтаксын давуу талыг ашигладаг.

Жишээлбэл, хэрэглэгчийн нэр, нууц үгийг оруулах боломжтой хоёр талбартай вэб хуудсыг авч үзий. Хуудасны арын код нь SQL query байх ба нууц үгийг хэрэглэгчийн нэрсийн жагсаалтаас шалгана:

Хэрэв энэ хайлт ямар ч мөрийг буцаадаг бол хандалт хийж болно. Гэсэн хэдий ч, хортой хэрэглэгчийн нэрийг оруулаад, зарим нэг хүчин төгөлдөр код (Нууц үгийн талбарт 'OR' 1 '=' 1) оруулбал, хайлтын үр дүн дараах байдалтай байна:

Дээрх жишээнд "Нууц үг" гэж хоосон эсвэл зарим нэг тэмдэгт буруу гэж тооцогддог. "'1' = '1'" нь үргэлж үнэн байх бөгөөд олон мөр буцаагдаж, ингэснээр хандалтыг зөвшөөрөх болно.

Энэ аргыг олон өгөгдөл явуулахыг зөвшөөрөхийн тулд, эсвэл гадны програмуудыг ачаалах, ажиллуулж боловсронгуй болгож болно. Дараах форматаар кюэри бичсэн гэж үзье:

Халдагч хэрвээ дараах оролттой бол :

`UserID: ';DROP TABLE User; --'`

`Password: 'OR"='`

query нь дараахь байдалтай байна :

Үүний үр дүнд хүснэгтийн хэрэглэгч өгөгдлийн сангаас устгагдах болно. Үүний учир нь “ ; “ тэмдэг нь нэг тушаалын төгсгөл болон шинэ эхлэлийг илэрхийлнэ. “ – “тэмдэг нь тайлбарын эхлэлийг илэрхийлнэ.

### HTML script injection
Вэб сервер нь хэрэглэгчээс ирсэн жижиг зурвасуудыг хүлээн авах зочин скрипттэй бөгөөд ихэвчлэн ийм мессежийг хүлээн авдаг
  
Гэсэн хэдий ч хортой этгээд guidebook – дэх  code injection - ийн  эмзэг байдлын талаар мэдэж болох бөгөөд ийм мессеж ирдэг

Хэрвээ өөр хэрэглэгч энэ хуудсыг харвал code injection – ийг гүйцэтгэнэ. Энэ код нь халдагч өөр хэрэглэгчийг халдах боломжийг олгодог. Гэсэн хэдий ч энэ програм хангамжийн алдаа нь санамсаргүй тохиолдлоор үүсгэгдэж болох боловч харамсалтай нь хэрэглэгчийн вэбсайтад муу HTML кодыг үзүүлэх болно.
 
```html+php
That post was awesome, >:)
```
HTML / Скриптийн injection нь "Cross-Site Scripting" эсвэл "XSS" гэсэн нэрээрээ их алдартай сэдэв юм. XSS нь хэрэглэгчийн оролтыг веб скриптэд оруулах эсвэл ямар нэгэн зүйл HTML код эсвэл скриптийг шалгахгүйгээр гаралтын HTML-д байрлуулсан тарилгын /injection - ийн/ алдаа юм.

Эдгээр асуудлуудын ихэнх нь оролтын өгөгдөл ямар байх боломжтой, эсвэл тусгай өгөгдлийн үр нөлөөний буруу төсөөллүүдтэй холбоотой байдаг. 

### Эмзэг байдлын динамик үнэлгээ
Eval injection – ийн эмзэг байдал нь халдагч оролтыг бүхэлд нь эсвэл хэсэгчлэн хянах боломжтой үед eval () функцээр дамжуулан тохиолддог.

"Eval" -ын аргументыг PHP шиг боловсруулдаг болохоор нэмэлт командууд нэмж болно. Жишээлбэл, "arg" нь "10тын" системд тохируулагдсан бол сервер дээр ажиллах програмын нэмэлт код нь "/ bin / echo" –г ашигласан.

### Object injection/Объект тарилга
PHP нь бүх обьектуудын хувьд цуваалах /serialization/ болон цувруулахгүй /deserialization/ байх боломжийг олгодог. Хэрэв найдваргүй оролтыг deserialization функц уруу оруулахыг зөвшөөрвөл програмд байгаа классуудыг дарж бичиж, хорлонтой халдлагыг гүйцэтгэх боломжтой. Joomla! 2013 онд ийм халдлагыг илрүүлж байсан.

### Remote file injection/Файлын удирдлагаын тарилга
PHP програмыг авч үзвэл (энэ нь хүсэлтээр тодорхойлогдсон файлыг агуулсан):

Жишээ нь зөвхөн цэнхэр.php болон red.php шиг өнгөний файлуудыг уншиж болох бөгөөд харин халдагчид нь  файлыг ашиглаж PHP-г гадны файлыг ачаалахад хүргэж болох юм.

### Format Specifier Injection /Форматыг тодорхойлох тарилга
 Тэмдэгт мөрийн алдаа нь  ихэвчлэн програмист хэрэглэгчийн оруулсан тэмдэгт мөрийн өгөгдлийг хэвлэх үед гардаг алдаа. Програмист нь `printf("%s", buffer)` -ын оронд `printf(buffer)`гэж алдаж бичиж болно. Эхний хувилбар нь буферыг тэмдэгт мөрөөр илэрхийлж, мөн ямар ч форматтай заавруудыг агуулдаг. Хоёр дахь хувилбар нь програмистийн хувьд дэлгэц рүү тэмдэгт мөр хэвлэгддэг. 

Дараах Си хэл дээр бичигдсэн бага хэмжээний програмыг авч үзье: Энэ нь char array password гэдэн нэртэй дотоод хувьсагчид нууц үгийн утгыг олгодог; програм нь хэрэглэгчээс бүхэл тоо болон тэмдэгт мөрийн утгыг авна, үүний дараагаар нь хэрэглэгчийн өгсөн тэмдэгт мөрийг давталтанд оруулна.

Хэрэглэгчийн оролт нь `%s%s%s%s%s%s%s%s`  гэх форматын жагсаалтаар дүүрсэн бол `printf()` нь стекээс уншиж эхлэх болно. Эцэст нь, %s форматын тодорхойлогч нь стек дээр байгаа нууц үгийн хаягийг хандаж, `Password1`-ийг дэлгэц дээр хэвлэнэ.

### Shell injection
Shell injection (эсвэл Command Injection) UNIX shell нэрээр нэрлэгддэг боловч ихэнх програм хангамжийг програмаар тушаалын мөрөөр гүйцэтгэх боломжийг олгодог. Shell injection-тай холбоотой функцууд нь `system()`, `StartProcess()`,`System.Diagnostics.Process.Start()`зэрэг нь орно.

Дараах PHP хэл дээр бичигдсэн, `funnytext` гэсэн нэртэй гадаад файлаас хэрэглэгчийн оруулсан утгыг авдагбага хэмжээний програмыг авч үзвэл

Inject хийх хэд хэдэн төрлийн shell – ийн синтаксыг боломжуудын жагсаалт (энэ жагсаалт бүрэн биш): 

Зарим хэл дээр хэрэглэгддэг функцүүд :
* PHP: `escapeshellarg()` болон `escapeshellcmd()`
* Python: `shlex.quote()`
Програмистуудад эдгээр үүргүүдийн талаар мэдэж авах / сурахаыг зөвөлдөг бөгөөд shell command-уудыг байнга ашиглахыг санах болгодог. Хэрэглэгчийн оролтыг баталгаажуулах эсвэл цэвэрлэхийн тулд эдгээр функцийг ашиглах хэрэгтэй.

Аюулгүй хувилбар нь бүрхүүлийн дамжуулалтаас шууд гаднах програмуудыг шууд удирдаж ажилладаг API-үүдийг ашиглан бүрхүүлийн тарилга хийх боломжийг хязгаарладаг. 

## Нэмэлт мэдээлэл
* Arbitrary code execution
* Buffer overflow
* Debugging
* File inclusion vulnerability
* Mobile code
* Monitor
* SGML entity
* Shellshock (software bug)
* SQL injection
* Trojan horse (computing)
## Холбоосууд
Ангилал:Хөнөөлтэй програм