Home [TIL] CVE-2022-22978 : Authorization Bypass in RegexRequestMatcher
Post
Cancel

[TIL] CVE-2022-22978 : Authorization Bypass in RegexRequestMatcher

LINE CTF 2023에 나왔던 safenote 문제에서 사용된 CVE-2022-22978에 대해서 간단하게 이야기 해볼려고 합니다. 몰랐는데 해당 취약점은 LINE에서 발견한 CVE였습니다.🫢

CVE-2022-22978


영향받는 버전


영향받는 spring security 버전은 다음과 같습니다.
affected

분석


해당 취약점이 패치된 commit부분을 보면 아래와 같습니다. Pattern 클래스는 java.utils.regex 패키지에 있는 패턴 관련 클래스입니다. 정규 표현식 에서 쓰이는 .으로 문자열 매칭을 표현할 때, Pattern.DOTALL플레그를 사용하여 기존에 CRLF(\r\n)와 매칭되지 않는 문제를 해결한 것으로 보입니다. commit

간단한 예시를 통해서 살펴보면 아래와 같이 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를 사용하는 것을 볼 수 있습니다.
security_config

/api/adminRequestMapping되는 /key/{id} 엔드포인트에서 조건을 통과하면 application.properties파일에서 하드코딩된 jwt.secret-key를 가져옵니다. 따라서 이 취약점을 이용하여 /api/admin/key/%0a로 요청을 보내 권한을 우회하여 admin의 jwt를 읽을 수 있습니다.(로컬에서 테스트했기 때문에 XXX...로 표시됩니다)
secret

local

Reference


[TIL] 신기한 parseInt()

[Journal] Halfway through 2023!

Comments powered by Disqus.