기업 자바 응용프로그램은 신뢰할 수 없는 입력을 수용해야 하고, 복잡한 서브시스템과 상호작용해야 하기 때문에 공격당하기 쉽다.
만약 응용프로그램 안에 사용된 컴포넌트들이 공격당하기 쉬운 경우라면, 응용프로그램에 대한 인젝션 공격 (크로스-사이트 스크립팅(XSS), XPath와 LDAP 인젝션 등)이 가능하다.
이를 완화하는 효과적인 전략은 번역되기 전에 입력을 화이트리스트(Whitelist)화하고 출력을 인코딩하거나 이스케이핑(escaping) 하는 것이다.
1 챕터 안전성은 자바 기반의 응용프로그램에 대하여 안전성을 보장하기 위한 가이드라인을 기술한다.
- 민감한 데이터 다루기
- 일반적인 인젝션 공격 피하기
- 보안성을 해치도록 오용될 수 있는 언어적 특징
- 자바의 섬세한 보안 메커니즘의 세부사항
입력 데이터 화이트리스트화
- 화이트리스트는 특정 문자열이나 패턴들을 명시적으로 허용하는 목록을 말한다.
- 입력 데이터를 화이트리스트화하면, 애플리케이션이 허용되지 않은 문자열이나 코드를 거부하게 된다.
- 이를 통해 악의적인 입력을 필터링하여 취약점을 방지할 수 있다.
- 예를 들어, 입력 데이터가 숫자만 포함되어야 하는 경우에는 숫자 이외의 문자를 필터링하여 받아들이지 않는 것이다.
출력 데이터 인코딩 또는 이스케이핑
- 출력 데이터를 인코딩하거나 이스케이핑하여, 악의적인 스크립트나 코드를 무력화시킨다.
- 인코딩은 특수 문자들을 해당 문자의 표현으로 변경하여 보안을 강화하는 방법이다.
- 이스케이핑은 특정 문자들을 이스케이프 문자와 함께 사용하여 그 특정 문자들을 그대로 출력하지 않도록 하는 것이다.
- 이를 통해 악의적인 스크립트가 실행되지 않도록 방지하거나 데이터가 올바르게 처리되도록 보장할 수 있다.
자바의 안전성
자바 프로그래밍 언어와 런타임 시스템은 안전성을 염두에 두고 설계되었다.
(명시적 포인터 사용 X, null 포인터 참조하면 예외 발생)
자바는 타입에 대해 엄격하게 처리하는 언어이다.
(산술 타입과 변환에서와 같이 모든 암묵적 타입 변환에 대해 플랫폼 독립적으로 잘 정의되어 있다.)
JVM은 바이트코드가 자바 언어 규격을 준수하면서 수행되도록 보장하기 위해 바이트코드 검증기를 내장하고 있다.
자바 클래스 로더 메커니즘
자바 클래스 로더 메커니즘은 클래스를 로드할 때 클래스의 신뢰성을 검사하고 신뢰할 수 있는 시스템 클래스와 신뢰가 불분명한 클래스를 구분하는 기능을 제공하는데, 이를 통해 보안 측면에서 안전한 클래스 로딩을 보장한다.
클래스 파일은 보통 디지털 서명(Digital Signature)이 포함될 수 있다. 디지털 서명은 클래스 파일을 생성한 개발자의 신원을 확인하고, 클래스 파일이 수정되지 않았음을 보장하는 데 사용된다. 이 디지털 서명은 개발자의 개인 키로 생성되며, 클래스 파일에 첨부된다.
자바 클래스 로더는 클래스를 로드하는 과정에서 다음과 같은 보안 검사를 수행한다.
1. 클래스 서명 확인
- 클래스 로더는 클래스 파일에 포함된 디지털 서명을 확인하여 해당 클래스 파일이 신뢰할 수 있는 출처에서 온 것인지 검사한다.
- 디지털 서명이 없거나 유효하지 않은 경우, 해당 클래스는 로드되지 않거나 보안 예외가 발생할 수 있다.
2. 보안 정책 검사
- JVM은 보안 정책 파일에 정의된 규칙에 따라 클래스를 검사한다.
- 이 보안 정책은 특정 클래스나 패키지에 대해 어떤 동작을 허용하거나 제한하는 규칙들을 정의한다.
- 따라서 애플리케이션이나 애플리케이션 서버의 보안 정책에 따라 클래스 로디오가 실행에 제약을 둘 수 있다.
자바 클래스 로더(Class Loader)
자바 가상 머신(JVM)의 중요한 구성 요소 중 하나로, 자바 프로그램에서 동적으로 클래스를 로드하고, 링크하고, 초기화하는 역할을 수행한다.
자바 언어의 특성 중 하나는 런타임 시에 필요한 클래스를 정적으로 로딩하는 것이 아니라 필요한 시점에 동적으로 로딩할 수 있다는 점인데, 이런 동적 로딩이 가능한 이유는 클래스 로더 메커니즘 덕분이다.
보안 메커니즘 제공
자바는 프로그래머가 시스템 정보, 파일, 소켓과 프로그래머가 사용하고자 하는 다른 보안에 민감한 자원에 대해 엑세스를 제어할 수 있도록 확장성 있고 섬세한 보안 메커니즘을 제공한다.
1. 런타임 보안 관리자(runtime security manager)
- 보통 보안 정책은 커맨드-라인 인자를 이용하여 지정하지만, 프로그램으로 설치되면 기존의 보안 정책에서 허용하지 않는 동작도 실행할 수 있도록 해준다.
2. 클래스 로더 메커니즘
- 클래스 로더 메커니즘을 이용하여 시스템 자바 클래스 외의 클래스에게 자원 엑세스 권한을 확장하는 것도 가능하다.
- 이는 자바의 동적 로딩 기능을 활용하여, 실행 중에 다른 외부 라이브러리나 플러그인 등에 대한 접근 권한을 관리하는 데 유용하다.
- 이를 통해 애플리케이션의 유연성과 확장성을 높일 수 있지만 보안 상의 이유로 이러한 기능을 사용할 때에는 신중하게 검토하고 적절한 보안 조치를 취해야 한다.
'Java > Secure Coding' 카테고리의 다른 글
[Secure Coding] 마구잡이 파일 업로드를 방지하라 (0) | 2023.08.07 |
---|---|
[Secure Coding] 보안에 민감한 메서드들이 검증된 매개변수를 가지고 호출되도록 보장하라 (0) | 2023.08.06 |
[Secure Coding] 민감한 가변적 클래스에 수정이 불가능한 래퍼를 제공하라 (0) | 2023.08.04 |
[Secure Coding] 클라이언트에 암호화되지 않은 민감-데이터를 저장하지 말라 (0) | 2023.08.03 |
[Secure Coding] 민감-데이터의 수명을 제한하라 (0) | 2023.07.24 |