Notice
Recent Posts
Recent Comments
Link
IgnatiusHeo
구현단계 보안약점 제거 기준-코드 삽입 본문
작성일: 230703
※ 본 게시글은 학습 목적으로 행정안전부·KISA의 소프트웨어 보안약점 진단 가이드, 소프트웨어 개발보안 가이드를 참고하여 작성하였습니다.
정리 내용: 소프트웨어 보안약점 진단 가이드(194~200p)
구분 | - 입력데이터 검증 및 표현 |
설계단계 | - 시스템 자원 접근 및 명령어 수행 입력값 검증 https://cryptocurrencyclub.tistory.com/92 |
개요 | 공격자가 소프트웨어의 의도된 동작을 변경하도록 임의 코드를 삽입하여 소프트웨어가 비정상적으로 동작하도록 하는 보안약점을 말한다. 코드 삽입은 프로그래밍 언어 자체의 기능에 의해서만 제한된다는 점에서 운영체제 명령어 삽입과 다르다. 취약한 프로그램에서 사용자의 입력 값에 코드가 포함되는 것을 허용할 경우, 공격자는 개발자가 의도하지 않은 코드를 실행하여 권한을 탈취하거나 인증 우회, 시스템 명령어 실행 등을 할 수 있다. |
진단 세부사항 (설계단계) |
① 외부 입력값을 이용하여 시스템자원을 식별하는 경우 허가되지 않은 자원이 사용되지 않도록 해야 한다. ㅇ 접근 허가된 시스템자원이 식별되고, 사용가능한 기능과 매핑되어 있는지 확인 ㅇ 시스템자원 접근 이력이 로그로 기록되도록 설계되어 있는지 확인 ㅇ 조작된 입력으로 비허가 자원의 접근가능 여부를 점검할 수 있는 테스트 계획의 수립 여부 확인 → 경로조작에 사용 가능한 문자: / \\ ② 서버프로그램 안에서 셸을 생성하여 명령어를 실행해야 하는 경우 외부입력값에 의해 악의적인 명령어가 실행되지 않도록 해야 한다. ㅇ 명령어 실행 기능 포함여부를 식별, 해당 기능의 실행 가능 명령어 파라미터의 제한 설계 여부 확인 ㅇ 운영체제 명령어 실행 이력이 로그로 기록되도록 설계되어 있는지 확인 → 누가/언제/어느IP에서 썼는지 확인 가능하도록 설계되어야함. ㅇ 조작된 입력으로 비허가 명령어의 실행 가능 여부 테스트 계획 수립 여부 확인 → 검증해야 할 특수문자: | & ; |
보안대책 (구현단계) |
동적코드를 실행할 수 있는 함수를 사용하지 않는다. 필요 시, 실행 가능한 동적코드를 입력 값으로 받지 않도록, 외부 입력 값에 대하여 화이트리스트 방식으로 구현한다. 또는 유효한 문자만 포함하도록 동적 코드에 사용되는 사용자 입력 값을 필터링 한다. |
진단방법 (구현단계) |
① 각 언어에서 제공하고 있는 동적실행 함수를 확인한다. ② 동적코드 실행에 사용되는 데이터가 신뢰할 수 있는 값인지 확인한다. 이 때, 데이터가 신뢰할 수 없는 값이나 별도의 검증절차가 없으면 취약하다고 판단한다. |
다. 코드예제
ㅇ 분석
1: public class CodeInjectionController {
2: @RequestMapping(value = "/execute", method = RequestMethod.GET)
3: public String execute(@RequestParam("src") String src)
4: throws ScriptException {
5: ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
6: ScriptEngine scriptEngine= scriptEngineManager.getEngineByName("javascript");
7:
8: String retValue = (String)scriptEngine.eval(src);
9: return retValue;
10: }
11: }
ㅇ 설명
1. r3에서 입력받은 입력값 src에 대한 검증이 없음
2. 검증 없이 r8에서 src값을 실행함
ㅇ 수정
1: public class CodeInjectionController {
2: @RequestMapping(value = "/execute", method = RequestMethod.GET)
3: public String execute(@RequestParam("src") String src)
4: throws ScriptException {
if (!src.matches("[0-9+\\-*/(). ]+")) {
throw new IllegalArgumentException("Invalid input");
}
5: ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
6: ScriptEngine scriptEngine= scriptEngineManager.getEngineByName("javascript");
7:
8: String retValue = (String)scriptEngine.eval(src);
9: return retValue;
10: }
11: }
ㅇ 설명
1. 수식에 관련된 값들만 허용하도록 설정해놓음
2. 코드에서 입력값으로 허용하는 목록에 따라 필터값은 달라서 ..
ㅇ 분석
1: <body>
2: <%
3: String name = request.getparameter("name");
4: %>
5: ...
6:<script>
7:
8: (new Function(<%=name%>))();
9: </script>
10: </body>
ㅇ 설명
1. name값에 대한 검증 ㅇㄷ???
2. 해결하려면....... escape?
끝.
'자격 > SW보안약점진단원' 카테고리의 다른 글
구현단계 보안약점 제거 기준-크로스사이트 스크립트 (0) | 2023.07.03 |
---|---|
구현단계 보안약점 제거 기준-경로 조작 및 자원 삽입 (0) | 2023.07.03 |
구현단계 보안약점 제거 기준-SQL 삽입 (0) | 2023.07.03 |
설계단계 보안설계기준-세션통제 (0) | 2023.06.30 |
설계단계 보안설계기준-예외처리 (0) | 2023.06.30 |