1. 무결성 검사 없는 코드 다운로드의 위험성
CWE-494는 애플리케이션이 실행 중에 필요한 라이브러리, 플러그인, 또는 업데이트 패치를 원격 서버에서 다운로드할 때, 해당 파일이 신뢰할 수 있는 소스에서 온 것인지 또는 전송 과정에서 변조되지 않았는지 확인하지 않을 때 발생합니다. 공격자는 DNS 스푸핑이나 **중간자 공격(MitM)**을 통해 정상적인 코드를 악성 코드로 교체할 수 있습니다. 만약 무결성 검사 없이 이 코드가 실행된다면, 공격자는 대상 시스템에서 원격 코드 실행(RCE) 권한을 얻어 시스템을 완전히 장악할 수 있습니다.
2. 흔히 발생하는 취약한 패턴
주로 동적 업데이트 기능이나 플러그인 기반 아키텍처에서 나타납니다.
• HTTP 프로토콜 사용: 암호화되지 않은 HTTP를 통해 실행 파일을 다운로드하여 전송 구간 변조에 노출되는 경우.
• 서명 검증 생략: 다운로드한 파일의 디지털 서명(Signature)이나 해시(Hash) 값을 확인하지 않고 즉시 로드(Load)하는 경우.
• 불분명한 출처: 공식 저장소가 아닌 신뢰할 수 없는 URL에서 코드를 가져오는 경우.
3. 실무적 대응: 디지털 서명과 전송 보안
외부 코드를 수용할 때는 '의심하고 확인하는' 절차가 필수적입니다.
• HTTPS 강제 적용: 모든 다운로드 채널에 TLS(HTTPS)를 적용하여 전송 구간의 기밀성과 무결성을 확보합니다.
• 디지털 서명 검증: 코드 배포자가 서명한 인증서를 확인하고, 공개키 방식을 통해 서명의 유효성을 검증합니다(CWE-347 연계).
• 해시값 대조: 제공처에서 공식적으로 게시한 해시값(SHA-256 등)과 다운로드한 파일의 해시값을 비교하여 파일의 무결성을 확인합니다.
• 로컬 화이트리스트: 허용된 인증서로 서명된 코드만 실행할 수 있도록 정책을 수립합니다.
4. CWE-494 대응 및 안전한 코드 다운로드 자바 코드 예시
코멘트: 네트워크를 통해 넘어온 데이터는 '데이터'일 때보다 '코드'일 때 수만 배 더 위험합니다. 무결성이 확인되지 않은 코드를 실행하는 것은 공격자에게 서버의 열쇠를 넘겨주는 것과 같습니다. logger.debug()를 통해 검증 과정을 기록하되, 해시값이 단 한 글자라도 다르다면 절대 해당 코드를 로드하지 않는 단호함이 필요합니다.
댓글 달기