[하루한줄] CVE-2024-6922: Automation 360의 SSRF 취약점

URL

https://www.rapid7.com/blog/post/2024/07/26/cve-2024-6922-automation-anywhere-automation-360-server-side-request-forgery/

Target

  • Automation 360 Robotic Processs Automation suite v21 ~ v32

Explain

Automation 360은 Control Room 서버로, 클라이언트 에이전트와 통신하거나 자동화된 워크플로를 생성하는 중앙집중형 관리를 위한 솔루션입니다.

이러한 Automation 360에서 인증되지 않은 공격자가 접근이 제한된 API, 로컬 서비스 등에 접근할 수 있는 SSRF 취약점이 발견되었고, 관련 세부 정보가 공개되었습니다.

<!-- proxy -->
<sec:intercept-url pattern="/v1/proxy/test" access="permitAll()"/>

kernel.jarspring/authn-context-global-security-urls.xml 파일에는 URL 패턴 /v1/proxy/test 이 인증되지 않은 모든 액세스를 허용하도록 설정되어 있습니다.

해당 API 엔드포인트는 testSDSProxyCredentials 함수에 구현되어 있습니다.

public void testSDSProxyCredentials(
    final SDSProxyCredTestRequest proxyCredsToTest) {
  if (proxyCredsToTest.getSaasUrl().isEmpty()) {
    throw new IllegalArgumentException(
        "Please provide a valid SaaS system url.");
  }
  // escape with # character
  final String saasUrl = String.format(
      "https://%s/v1/authentication", proxyCredsToTest.getSaasUrl()); 
  HttpURLConnection httpURLConnection = null;
  final String proxyUsername = proxyCredsToTest.getUsername();
  final String proxyPassword = proxyCredsToTest.getPassword();
  final boolean proxyCredsPassed = !proxyUsername.isEmpty();
  String CLOUD_CR_CONNECTION_FAILED =
      "Unable to connect to cloud control room.";
  try {
    try {
      httpURLConnection = ProxyUtil.getConnection(saasUrl);
      httpURLConnection.setDoOutput(true);
      httpURLConnection.setRequestMethod("POST");
      httpURLConnection.setRequestProperty("Content-Type", "application/json");
    } catch (final Exception e) {
      this.proxyAuditService.addAuditLog(
          ProxyAuditValue.PROXY_CONNECTIVITY_TEST_FAILURE,
          CLOUD_CR_CONNECTION_FAILED);

      throw new RuntimeException(e);
    }
    if (proxyCredsPassed) {
      ProxyUtil.setAuthenticator(
          saasUrl, httpURLConnection, proxyUsername, proxyPassword);
    }

    try {
      final DataOutputStream wr =
          new DataOutputStream(httpURLConnection.getOutputStream()); // [3]
//...

함수는 POST 요청 본문 중 SaaS 시스템 URL을 의미하는 JSON 형식의 saasUrl 값을 처리합니다.

saasUrl/v1/authentication 경로를 붙여 해당 URL에 POST 요청을 보내는 것으로 authentication proxy를 수행하는데, 이때 saasUrl 마지막에 # 문자를 추가하면 # 뒤에 붙는 /v1/authentication 경로가 이스케이프되어 공격자가 임의의 호스트 및 경로에 접근할 수 있습니다.

curl -vvv 'http://192.166.15.138/v1/proxy/test' -d '{"saasUrl":"www.[Internal_API_Path]?param1=1...#"}'

이를 악용하면 외부 접근이 허용되지 않은 백엔드 API 혹은 서비스 등에 임의의 POST 요청을 보낼 수 있습니다.