API는 호출자와 피호출자 간의 계약입니다. 가장 흔한 형태의 API 오용은 호출자가 이 계약에서 자신의 몫을 이행하지 못하기 때문에 발생합니다. 예를 들어, 프로그램이 chroot()를 호출한 후 chdir()을 호출하지 못하면 활성 루트 디렉터리를 안전하게 변경하는 방법을 지정하는 계약을 위반하는 것입니다. 라이브러리 오용의 또 다른 좋은 예는 피호출자가 호출자에게 신뢰할 만한 DNS 정보를 반환할 것으로 예상하는 것입니다. 이 경우, 호출자는 자신의 행동에 대해 특정한 가정을 함으로써(반환 값이 인증 목적으로 사용될 것으로 예상) 피호출자 API를 오용합니다. 다른 쪽에서 호출자-피호출자 계약을 위반할 수도 있습니다. 예를 들어, 코더가 하위 클래스 SecureRandom을 지정하고 임의 값이 아닌 값을 반환하는 경우 계약을 위반하는 것입니다.
DBMS_UTILITY.EXEC_DDL_STATEMENT
는 데이터 정의 언어의 일부로 분류된 문만 실행합니다. 포함된 SQL에서 지원하지 않는 기타 SQL 문은 포함된 자동으로 무시됩니다. 이 동작은 해당 절차를 사용할 때 오류를 감지하기 어렵게 합니다.http://www.example.com/index.php?param=...
이라는 URL에서 index.php
내 php의 다음 조각은 "0 또는 더 많은 영숫자"를 표시하는 POSIX 정규식 '^[[:alnum:]]*$'
와 일치하는 경우 화면에 URL 매개 변수 param
("..."의 지난 자리) 값을 인쇄합니다.
<?php
$pattern = '^[[:alnum:]]*$';
$string = $_GET['param'];
if (ereg($pattern, $string)) {
echo($string);
}
?>
Example 1
이 영숫자 입력과 함께 예상대로 작동하는 동안 불안전한 ereg()
함수는 감염된 입력 확인에 사용되므로 null
byte injection을 통해 Cross-Site Scripting(XSS) 공격을 수행할 수 있습니다. null
바이트와 <script>
태그가 붙는 유효한 영숫자 문자열을 포함한 param
값을 전달하면(예: "Hello123%00<script>alert("XSS")</script>"
) ereg()
함수가 입력 문자열을 왼쪽에서 오른쪽으로 읽을 때 null
바이트 문자 뒤에 오는 모든 사항을 무시하며 ereg($pattern, $string)
은 true
를 계속 반환합니다. 이 예제에서는 null
바이트 뒤에 삽입된 <script>
태그가 사용자에게 표시되며 평가된다는 의미입니다.xp_cmdshell
함수는 안전하게 사용할 수 없습니다. 사용하지 않는 것이 좋습니다.xp_cmdshell
함수는 Windows 명령 셸을 시작하여 제공된 명령 문자열을 실행합니다. 명령은 기본 시스템이나 제공된 프록시 컨텍스트에서 실행됩니다. 그러나 미리 지정된 권한 작업 세트에 대해 사용자를 제한할 수 없으며 권한 승인은 사용자가 명령 문자열을 실행할 수 있도록 합니다.chroot()
시스템 호출을 잘못 사용하면 공격자가 chroot jail을 빠져나갈 수 있습니다.chroot()
시스템 호출로 프로세스가 file system의 루트 디렉터리 개념을 변경할 수 있습니다. chroot()
를 올바로 호출하면 프로세스가 새 루트 디렉터리에서 정의한 디렉터리 트리 외부의 파일에 접근할 수 없습니다. 그런 환경을 chroot jail이라고 하며 일반적으로 프로세스를 훔쳐 파일의 무단 접근에 사용할 가능성을 방지하기 위해 사용합니다. 예를 들어, 많은 FTP 서버를 chroot jail에서 실행하여 서버에서 새 취약점을 발견한 공격자가 시스템에서 암호 파일 또는 기타 민감한 파일을 다운로드하는 것을 방지합니다.chroot()
를 잘못 사용하면 공격자가 chroot jail을 빠져나갈 수 있습니다. chroot()
함수 호출은 프로세스의 현재 작업 디렉터리를 변경하지 않기 때문에 chroot()
가 호출된 후에도 상대 경로가 chroot jail 외부의 file system 리소스를 참조할 수 있습니다.
chroot("/var/ftproot");
...
fgets(filename, sizeof(filename), network);
localfile = fopen(filename, "r");
while ((len = fread(buf, 1, sizeof(buf), localfile)) != EOF) {
fwrite(buf, 1, sizeof(buf), network);
}
fclose(localfile);
GET
명령을 구현하는 데 사용할 수 있습니다. FTP 서버는 /var/ftproot
외부의 파일에 대한 접근을 막기 위해 초기화 루틴에서 chroot()
를 호출합니다. 그러나 서버가 chdir("/")
를 호출하여 현재 작업 디렉터리를 변경할 수 없기 때문에 공격자가 "../../../../../etc/passwd
" 파일을 요청하여 시스템 암호 파일의 복사본을 얻을 수 있습니다.java.io
패키지를 사용하여 Enterprise JavaBeans 규격을 위반합니다.FileResponse
인스턴스를 생성하면 공격자가 응용 프로그램 바이너리를 다운로드하거나, 보호되는 디렉터리 내에 있는 임의의 파일을 볼 수 있습니다.
from django.http import FileResponse
...
def file_disclosure(request):
path = request.GET['returnURL']
return FileResponse(open(path, 'rb'))
...
예제 2: 다음 코드는 신뢰할 수 없는 데이터를 취하고 이를 사용하여 서버 쪽 전달에 사용되는 경로를 빌드합니다.
...
String returnURL = request.getParameter("returnURL");
RequestDispatcher rd = request.getRequestDispatcher(returnURL);
rd.forward();
...
...
<% String returnURL = request.getParameter("returnURL"); %>
<jsp:include page="<%=returnURL%>" />
...
...
String returnURL = request.getParameter("returnURL");
return new ModelAndView(returnURL);
...
<webflow:end-state id="finalStep" view="${requestParameters.url}"/>
<webflow:view-state id="showView" view="${requestParameters.test}">
<bean class="org.springframework.web.servlet.view.
InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
InternalResourceViewResolver
는 구성된 접두사를 사용하여 보기 속성으로 전달된 값을 연결하고 최종적으로 접미사를 추가합니다.
...
String returnURL = request.getParameter("returnURL");
return new ActionForward(returnURL);
...
realloc()
를 사용하지 마십시오. 이 함수를 사용하면 민감한 정보의 사본이 덮어쓰기가 안 되는 메모리에 남겨질 수 있습니다.realloc()
함수는 일반적으로 할당된 메모리 블록의 크기를 증가시킬 때 사용합니다. 이 작업을 수행할 때 이전 메모리 블록의 내용을 더 큰 새 블록에 복사해야 합니다. 이 작업은 원래 블록의 내용을 그대로 유지하지만 프로그램이 접근할 수 없게 하여 프로그램이 메모리의 민감한 데이터를 초기화하는 것을 방지합니다. 이후에 공격자가 메모리 덤프의 내용을 검사하게 되면 민감한 데이터가 노출될 수 있습니다.realloc()
를 호출합니다.
plaintext_buffer = get_secret();
...
plaintext_buffer = realloc(plaintext_buffer, 1024);
...
scrub_memory(plaintext_buffer, 1024);
realloc()
를 사용하기 때문에 처음에 plaintext_buffer
에 할당된 메모리에서 데이터의 복사본이 노출될 수 있습니다.VirtualLock
을 사용하지 마십시오. 함수가 항상 구현되는 것은 아닙니다.VirtualLock
함수는 메모리의 페이지가 디스크에 페이지되는 것을 방지하기 위한 것입니다. 하지만, Windows 95/98/ME에서 이 함수는 스텁(stub)으로 구현되며 아무런 영향을 끼치지 않습니다.