/etc/pki/ca-trust/extracted/java/cacerts 에 update-ca-trust extract로 your-cert.cer를 등록하는 방법
/etc/pki/ca-trust/extracted/java/cacerts 경로에 인증서를 등록하려는 경우, 이는 Java용 Trust Store에 해당하는 시스템 CA 통합 결과 파일입니다. 이 파일은 직접 수정하는 것이 아니라, update-ca-trust extract 명령으로 자동 생성되며, 다음 절차에 따라야 등록이 성공합니다.
목적:
update-ca-trust extract 실행 시 **/etc/pki/ca-trust/extracted/java/cacerts**에 your-cert.cer 인증서가 포함되도록 만드는 절차
**HTTP 요청 스머글링(HTTP Request Smuggling, HRS)**이란, **프론트엔드 서버(리버스 프록시, 로드 밸런서 등)**와 백엔드 서버(애플리케이션 서버) 간 HTTP 요청 해석 차이점을 악용하여 요청을 변조하거나 몰래 끼워 넣는 공격 기법을 의미합니다.
간단히 말하면,
"앞단 서버는 하나의 요청이라 생각했지만, 뒷단 서버는 두 개 이상의 요청으로 인식하여 공격자가 숨겨둔 악의적 요청이 몰래 처리되는 것" 이라고 할 수 있습니다.
어떻게 발생하는가?
HTTP 요청 본문의 길이를 명시하는 Content-Length 헤더와 요청을 여러 개로 구분하는 Transfer-Encoding: chunked 헤더의 해석 차이를 이용합니다.
프론트 서버와 백엔드 서버가 서로 다르게 이 두 헤더를 해석하면,
공격자가 숨긴 두 번째 요청이 정상 요청에 끼워 넣어져 처리될 수 있습니다.
예시 흐름
POST / HTTP/1.1
Host: example.com
Content-Length: 50
Transfer-Encoding: chunked
0
GET /admin HTTP/1.1
Host: example.com
프론트 서버는 Content-Length를 기준으로 해석하여 요청 완료라 판단하지만,
백엔드 서버는 Transfer-Encoding을 기준으로 해석하여 뒤의 숨은 GET 요청을 별개로 처리할 수 있습니다.
주요 공격 결과
공격 효과설명
요청 가로채기
다른 사용자의 요청을 탈취할 수 있습니다.
세션 하이재킹
세션 토큰 탈취 가능.
캐시 포이즈닝
잘못된 응답을 캐시하여 불특정 다수에게 악성 응답을 제공할 수 있습니다.
비인가 요청 전송
관리자 페이지 접근, CSRF 보조 공격 등.
방어 및 대응 방법
대응 방법세부 설명
단일 길이 기준 강제화
Content-Length 또는 Transfer-Encoding 중 하나만 허용.
HTTP 요청 일관성 검사
서버 간 동일한 해석 기준 유지 (엄격한 RFC 준수).
최신 웹서버/프록시 업데이트
nginx, Apache, HAProxy 등의 보안 패치 적용.
WAF 규칙 강화
WAF(Web Application Firewall)에서 의심 요청 차단.
input validation 강화
HTTP 요청 헤더와 바디를 철저히 검증.
덧붙여
HTTP Request Smuggling은 2005년에 처음 발견되었으나, 2020년대 이후 클라우드 환경, API Gateway, Reverse Proxy 사용 증가로 인해 다시 부각되었습니다. 특히 Android 앱에서도 백엔드와 통신할 때 리버스 프록시를 거치는 경우, 서버 측 대응이 매우 중요합니다.
추가로
Android App 관점에서 HTTP Request Smuggling 대응 가이드
1. 앱 내부 네트워크 통신 라이브러리 설정 강화
Android 앱은 보통 OkHttp, Retrofit, HttpURLConnection 등을 통하여 서버와 통신합니다. 이를 사용하는 경우, 기본 설정만으로는 일부 우회 시도가 가능할 수도 있으므로, 아래를 꼭 지켜야 합니다.
OkHttp / Retrofit 대응
HTTP/1.1 또는 HTTP/2 명시적 사용 (HTTP/0.9, HTTP/1.0은 지원 차단)
Transfer-Encoding: chunked 사용 최소화
Content-Length 헤더의 일관성 확보 (명시적 지정 권장)
val client = OkHttpClient.Builder()
.protocols(listOf(Protocol.HTTP_1_1, Protocol.HTTP_2))
.build()
Interceptor 추가로 비정상 요청 방어
class HeaderValidationInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val headers = request.headers
// 의심스러운 헤더 검증
if (headers.names().any { it.equals("Transfer-Encoding", ignoreCase = true) }
&& headers.names().any { it.equals("Content-Length", ignoreCase = true) }) {
throw IOException("Invalid HTTP headers detected: Smuggling risk.")
}
return chain.proceed(request)
}
}
// 적용 예시
val safeClient = OkHttpClient.Builder()
.addInterceptor(HeaderValidationInterceptor())
.build()
2. 서버와 통신 시 HTTPS 강제 사용
반드시 HTTPS 통신만 허용할 것.
앱의 network_security_config.xml을 설정하여 **Cleartext Traffic(HTTP)**을 차단할 것.