1. LDAP 삽입의 발생 원인과 위험성
LDAP(Lightweight Directory Access Protocol) 삽입은 사용자로부터 입력받은 값이 적절한 필터링 없이 LDAP 질의문(Filter) 생성에 직접 사용될 때 발생합니다. 공격자가 LDAP 특수문자(*, (, ), &, |)를 주입하여 쿼리 구조를 조작하면, 인증 없이 관리자 권한을 획득하거나 디렉터리 서비스 내의 민감한 사용자 정보(부서, 직급, 이메일 등)를 무단으로 열람할 수 있습니다. 이는 기업 내부망 보안의 핵심인 인증 체계를 뿌리째 흔들 수 있는 치명적인 위협입니다.
2. 흔히 발생하는 취약한 패턴
가장 대표적인 사례는 로그인 기능이나 사원 검색 기능에서 입력값을 문자열 결합(+) 방식으로 LDAP 필터에 포함하는 경우입니다. 예를 들어, 아이디 검색 필터가 (uid=${userId})일 때 공격자가 *를 입력하면 모든 사용자의 정보를 불러오게 됩니다. 또한, admin)(&)와 같은 값을 주입하여 조건절을 무력화하고 관리자 계정으로 로그인을 시도하는 것이 전형적인 공격 패턴입니다.
3. 실무적 대응: 매개변수화된 질의와 특수문자 거부
SQL 삽입 방어와 마찬가지로, LDAP에서도 데이터와 쿼리 구조를 분리하는 것이 핵심입니다.
• 매개변수화된 질의(Parameterized Query): JNDI(Java Naming and Directory Interface)를 사용할 때 검색 필터에 직접 값을 넣지 말고, {0}, {1}과 같은 플레이스홀더를 사용하여 값을 바인딩하십시오.
• 입력값 화이트리스트 검증: 아이디나 사번 등 입력값이 정해진 형식(영문, 숫자 등)을 따르는지 정규식으로 엄격히 체크하고, LDAP 특수문자가 포함된 경우 요청을 즉시 거부(CWE-112 준수)합니다.
4. CWE-90 대응 및 안전한 LDAP 조회 자바 코드 예시
코멘트: 기업의 인사 정보나 권한 체계를 담고 있는 LDAP은 공격자에게 매우 매력적인 타깃입니다. 사용자가 입력한 필터 조건을 절대 그대로 실행하지 마십시오. JNDI의 매개변수화된 검색 기능을 활용하고 logger.debug()로 모든 인증 시도를 기록하되, 특수문자 하나가 전체 보안망을 뚫는 통로가 되지 않도록 입구를 철저히 필터링하는 것이 시큐어 코딩의 정석입니다.
댓글 달기