LINE CTF 2023
에 나왔던 safenote
문제에서 사용된 CVE-2022-22978
에 대해서 간단하게 이야기 해볼려고 합니다. 몰랐는데 해당 취약점은 LINE
에서 발견한 CVE였습니다.🫢
CVE-2022-22978
영향받는 버전
영향받는 spring security 버전은 다음과 같습니다.
분석
해당 취약점이 패치된 commit부분을 보면 아래와 같습니다. Pattern
클래스는 java.utils.regex
패키지에 있는 패턴 관련 클래스입니다. 정규 표현식 에서 쓰이는 .
으로 문자열 매칭을 표현할 때, Pattern.DOTALL
플레그를 사용하여 기존에 CRLF(\r\n)
와 매칭되지 않는 문제를 해결한 것으로 보입니다.
간단한 예시를 통해서 살펴보면 아래와 같이 Pattern.DOTALL
플래그를 사용하면 \r
나 \n
도 매칭이 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class TestRegex {
public static void main(String[] args) {
String pattern = "A.B";
String input = "A\nB";
Pattern p1 = Pattern.compile(pattern, Pattern.DOTALL);
Pattern p2 = Pattern.compile(pattern);
Matcher m1 = p1.matcher(input);
Matcher m2 = p2.matcher(input);
System.out.println(m1.matches()); // true
System.out.println(m2.matches()); // false
}
}
SafeNote 문제에서
스프링에서 보통 URL 패턴 정의할 때, antMatchers
를 통해 Ant-Style
패턴을 사용하지만 SecurityConfig
클래스를 보면 중간에 /api/admin
으로 시작하는 엔드포인트들은 regexMatchers
를 사용하는 것을 볼 수 있습니다.
/api/admin
이 RequestMapping
되는 /key/{id}
엔드포인트에서 조건을 통과하면 application.properties
파일에서 하드코딩된 jwt.secret-key
를 가져옵니다. 따라서 이 취약점을 이용하여 /api/admin/key/%0a
로 요청을 보내 권한을 우회하여 admin의 jwt
를 읽을 수 있습니다.(로컬에서 테스트했기 때문에 XXX...
로 표시됩니다)
Comments powered by Disqus.