코드 인젝션은 동적으로 구성되는 코드에 신뢰할 수 없는 입력이 삽입될 때 발생할 수 있다.
잠재적 취약점이 시작될 수 있는 확실한 한 가지 작업은 자바 코드에서 자바 스크립트를 사용하는 것이다.
javax.script 패키지는 자바 스크립팅 엔진을 정의하는 인터페이스들과 클래스를 자바 코드에서 사용하기 위한 프레임워크로 구성되어 있다.
javax.script API의 오용은 공격자로 하여금 대상 시스템에서 임의의 코드를 실행할 수 있도록 한다.
부적절한 코드 - javax.script API 오용
입력 값을 출력하는 자바스크립트로 신뢰할 수 없는 사용자 입력 삽입

- 해당 코드는 사용자로부터 JavaScript 코드를 입력받아서 실행한다.
- 신뢰할 수 없는 사용자 입력을 직접 실행하므로, 악의적인 사용자가 악의적인 JavaScript 코드를 주입할 수 있다.
악성 JavaScript 코드
dummy\');
var bw = new JavaImporter(java.io.BufferedWriter);
var fw = new JavaImporter(java.io.FileWriter);
with(fw) with(bw) {
bwr = new BufferedWriter(new FileWriter(\"config.cfg\"));
bwr.write(\"somem text\"); bwr.close();
}
//;
- 공격자는 악성 자바스크립트를 삽입하도록 조작된 매개변수를 넣을 수 있다.
- 이 스크립트는 "dummy"를 출력한 다음 config.cfg라고 불리는 설정 파일에 some text를 기록한다.
- 이렇게 실제 침해 코드는 임의의 코드를 수행할 수 있다.
솔루션 - 화이트리스팅
코드 인젝션 취약점에 대한 최선의 방어는 수행 가능한 사용자 입력을 코드 안에 포함시킬 수 없도록 하는 것이다.
예를 들어, 동적 코드 안에 사용된 사용자 입력은 그것이 유효하고 화이트리스트에 있는 문자들만 포함하고 있는지를 보장할 수 있도록 정제되어야 한다.
데이터 정제 (화이트리스팅)

- 데이터가 입력된 직후, 데이터를 저장하고 처리하는 데 사용되는 데이터에 대한 추상 클래스의 메서드를 이용하여 정제하는 것이 가장 좋다.
- 이름에 특수 문자가 허용되어야 한다면, 입력 검증을 위해 비교되기 전에 정규화되어야 한다.
- 이 솔루션은 스크립팅 엔진이 정제되지 않은 입력을 번역하지 못하도록 하기 위해 화이트리스팅을 사용한다.
솔루션 - 안전한 샌드박스
보안관리자를 사용하여 안전한 샌드박스를 생성
스크립트가 로컬 파일 시스템에 쿼리하는 것과 같은 임의의 명령어를 수행하지 못하도록 한다.
샌드박스
샌드박스는 프로그램이나 코드를 안전하게 실행하기 위한 격리된 환경을 나타낸다. 이 환경은 악의적인 동작이나 시스템에 영향을 미칠 수 있는 작업을 제한하여 보안을 강화하고 안전성을 유지하기 위해 사용된다.
일반적으로 웹 브라우저에서 사용자가 웹 페이지를 방문할 때 스크립트 언어 ex) JavaScript를 실행하는 환경은 샌드박스로 간주된다. 이것은 웹 페이지의 스크립트가 로컬 시스템에 액세스 하는 것을 방지하고, 사용자의 개인 정보와 시스템의 안전성을 보호하는 데 중요한 역할을 한다.
스프링부트와 접목하여 예제를 찾아보려고 했지만 sandbox에 대한 에제가 거의 전무해서 다음에 직접 개발하면서 알아보도록 하자.
'Java > Secure Coding' 카테고리의 다른 글
[Secure Coding] LDAP 인젝션을 방지하라 (0) | 2023.09.09 |
---|---|
[Secure Coding] XPath 인젝션을 방지하라 (0) | 2023.09.07 |
[Secure Coding] 출력을 적절하게 인코딩하거나 이스케이핑하라 (0) | 2023.08.11 |
[Secure Coding] 마구잡이 파일 업로드를 방지하라 (0) | 2023.08.07 |
[Secure Coding] 보안에 민감한 메서드들이 검증된 매개변수를 가지고 호출되도록 보장하라 (0) | 2023.08.06 |