계: Input Validation and Representation

입력 검증 및 표현 문제는 메타 문자, 대체 인코딩 및 숫자 표현 때문에 발생합니다. 보안 문제는 입력을 신뢰하기 때문에 발생합니다. 문제로는 "Buffer Overflows", "Cross-Site Scripting" 공격, "SQL Injection", 그 외 여러 가지가 있습니다.

LDAP Injection

Abstract
사용자의 입력을 받아 동적으로 LDAP 필터를 생성하면 공격자가 해당 문의 의미를 수정할 수 있습니다.
Explanation
LDAP injection 오류는 다음 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.

이런 경우, Fortify Static Code Analyzer는 데이터 소스를 신뢰할 수 있는 것으로 판단하지 않습니다.

2. 데이터를 사용하여 LDAP 필터를 동적으로 생성합니다.
예제 1: 다음 코드는 제공된 관리자에게 보고하는 모든 직원을 위한 레코드를 검색하는 LDAP 쿼리를 동적으로 생성하고 실행합니다. 관리자의 이름을 HTTP 요청에서 읽어들이므로 신뢰할 수 없습니다.


...
DirectorySearcher src =
new DirectorySearcher("(manager=" + managerName.Text + ")");
src.SearchRoot = de;
src.SearchScope = SearchScope.Subtree;

foreach(SearchResult res in src.FindAll()) {
...
}


관리자 John Smith에게 보고하는 직원을 검색하는 것처럼 일반적인 조건에서 이 코드가 실행하는 필터는 다음과 같습니다.


(manager=Smith, John)


하지만 상수 기반 쿼리 문자열과 사용자 입력 문자열을 연결하여 필터를 동적으로 생성하므로 쿼리는 managerName에 LDAP 메타 문자가 들어 있지 않은 경우에만 정확하게 동작합니다. 공격자가 managerNameHacker, Wiley)(|(objectclass=*) 문자열을 입력하면 쿼리는 다음과 같습니다.


(manager=Hacker, Wiley)(|(objectclass=*))


쿼리가 실행되는 권한에 따라 |(objectclass=*) 조건을 추가하면 필터가 디렉터리의 모든 항목과 일치되며 공격자가 전체 사용자 풀에 대한 정보를 검색할 수 있습니다. LDAP 쿼리를 수행하는 권한에 따라 이 공격의 범위가 제한될 수도 있지만, 공격자가 쿼리의 명령 구조를 제어할 수 있을 경우, 그러한 공격은 LDAP 쿼리를 실행하는 사용자가 접근할 수 있는 모든 레코드에 영향을 줄 수 있습니다.
desc.semantic.dotnet.ldap_injection
Abstract
사용자의 입력을 받아 동적으로 LDAP 필터를 생성하면 공격자가 해당 문의 의미를 수정할 수 있습니다.
Explanation
LDAP injection 오류는 다음 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.

2. 데이터를 사용하여 LDAP 필터를 동적으로 생성합니다.
예제 1: 다음 코드는 제공된 관리자에게 보고하는 모든 직원을 위한 레코드를 검색하는 LDAP 쿼리를 동적으로 생성하고 실행합니다. 관리자의 이름을 네트워크 소켓에서 읽어들이므로 신뢰할 수 없습니다.


fgets(manager, sizeof(manager), socket);

snprintf(filter, sizeof(filter, "(manager=%s)", manager);

if ( ( rc = ldap_search_ext_s( ld, FIND_DN, LDAP_SCOPE_BASE,
filter, NULL, 0, NULL, NULL, LDAP_NO_LIMIT,
LDAP_NO_LIMIT, &result ) ) == LDAP_SUCCESS ) {
...
}


관리자 John Smith에게 보고하는 직원을 검색하는 것처럼 일반적인 조건에서 이 코드가 실행하는 필터는 다음과 같습니다.


(manager=Smith, John)


하지만 상수 기반 쿼리 문자열과 사용자 입력 문자열을 연결하여 필터를 동적으로 생성하므로 쿼리는 manager에 LDAP 메타 문자가 들어 있지 않은 경우에만 정확하게 동작합니다. 공격자가 managerHacker, Wiley)(|(objectclass=*) 문자열을 입력하면 쿼리는 다음과 같습니다.


(manager=Hacker, Wiley)(|(objectclass=*))


쿼리가 실행되는 권한에 따라 |(objectclass=*) 조건을 추가하면 필터가 디렉터리의 모든 항목과 일치되며 공격자가 전체 사용자 풀에 대한 정보를 검색할 수 있습니다. LDAP 쿼리를 수행하는 권한에 따라 이 공격의 범위가 제한될 수도 있지만, 공격자가 쿼리의 명령 구조를 제어할 수 있을 경우, 그러한 공격은 LDAP 쿼리를 실행하는 사용자가 접근할 수 있는 모든 레코드에 영향을 줄 수 있습니다.
desc.dataflow.cpp.ldap_injection
Abstract
사용자의 입력을 받아 동적으로 LDAP 필터를 생성하면 공격자가 해당 문의 의미를 수정할 수 있습니다.
Explanation
LDAP injection 오류는 다음 경우에 발생합니다.
1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.

2. 데이터를 사용하여 LDAP 필터를 동적으로 생성합니다.
예제 1: 다음 코드는 제공된 관리자에게 보고하는 모든 직원을 위한 레코드를 검색하는 LDAP 쿼리를 동적으로 생성하고 실행합니다. 관리자의 이름을 HTTP 요청에서 읽어들이므로 신뢰할 수 없습니다.


...
DirContext ctx = new InitialDirContext(env);

String managerName = request.getParameter("managerName");

//retrieve all of the employees who report to a manager

String filter = "(manager=" + managerName + ")";

NamingEnumeration employees = ctx.search("ou=People,dc=example,dc=com",
filter);
...


관리자 John Smith에게 보고하는 직원을 검색하는 것처럼 일반적인 조건에서 이 코드가 실행하는 필터는 다음과 같습니다.


(manager=Smith, John)


하지만 상수 기반 쿼리 문자열과 사용자 입력 문자열을 연결하여 필터를 동적으로 생성하므로 쿼리는 managerName에 LDAP 메타 문자가 들어 있지 않은 경우에만 정확하게 동작합니다. 공격자가 managerNameHacker, Wiley)(|(objectclass=*) 문자열을 입력하면 쿼리는 다음과 같습니다.


(manager=Hacker, Wiley)(|(objectclass=*))


쿼리가 실행되는 권한에 따라 |(objectclass=*) 조건을 추가하면 필터가 디렉터리의 모든 항목과 일치되며 공격자가 전체 사용자 풀에 대한 정보를 검색할 수 있습니다. LDAP 쿼리를 수행하는 권한에 따라 이 공격의 범위가 제한될 수도 있지만, 공격자가 쿼리의 명령 구조를 제어할 수 있을 경우, 그러한 공격은 LDAP 쿼리를 실행하는 사용자가 접근할 수 있는 모든 레코드에 영향을 줄 수 있습니다.
desc.dataflow.java.ldap_injection
Abstract
사용자의 입력을 받아 동적으로 LDAP 필터를 생성하면 공격자가 해당 문의 의미를 수정할 수 있습니다.
Explanation
LDAP injection 오류는 다음 경우에 발생합니다.
1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.

2. 데이터를 사용하여 LDAP 필터를 동적으로 생성합니다.
예제 1: 다음 코드는 제공된 관리자에게 보고하는 모든 직원을 위한 레코드를 검색하는 LDAP 쿼리를 동적으로 생성하고 실행합니다. 관리자의 이름을 HTTP 요청에서 읽어들이므로 신뢰할 수 없습니다.


...
$managerName = $_POST["managerName"]];

//retrieve all of the employees who report to a manager

$filter = "(manager=" . $managerName . ")";

$result = ldap_search($ds, "ou=People,dc=example,dc=com", $filter);
...


관리자 John Smith에게 보고하는 직원을 검색하는 것처럼 일반적인 조건에서 이 코드가 실행하는 필터는 다음과 같습니다.


(manager=Smith, John)


하지만 상수 기반 쿼리 문자열과 사용자 입력 문자열을 연결하여 필터를 동적으로 생성하므로 쿼리는 managerName에 LDAP 메타 문자가 들어 있지 않은 경우에만 정확하게 동작합니다. 공격자가 managerNameHacker, Wiley)(|(objectclass=*) 문자열을 입력하면 쿼리는 다음과 같습니다.


(manager=Hacker, Wiley)(|(objectclass=*))


쿼리가 실행되는 권한에 따라 |(objectclass=*) 조건을 추가하면 필터가 디렉터리의 모든 항목과 일치되며 공격자가 전체 사용자 풀에 대한 정보를 검색할 수 있습니다. LDAP 쿼리를 수행하는 권한에 따라 이 공격의 범위가 제한될 수도 있지만, 공격자가 쿼리의 명령 구조를 제어할 수 있을 경우, 그러한 공격은 LDAP 쿼리를 실행하는 사용자가 액세스할 수 있는 모든 레코드에 영향을 줄 수 있습니다.
desc.dataflow.php.ldap_injection