[하루한줄] CVE-2024-6922: Automation 360의 SSRF 취약점
URL
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.jar
내 spring/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 요청을 보낼 수 있습니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.