소스코드 보안약점 진단 // 소프트웨어 보안약점 진단 // SW 보안약점 진단과 같이 다양한 이름으로 불리는 진단 과업 중 하나이다.
SW개발보안은 해킹 등 사이버공격의 원인인 보안약점을 SW개발단계에서 사전에 제거하고 SW 개발 생명주기의 각 단계별로 수행하는 일련의 보안활동을 통하여 안전한 SW를 개발·운영하기 위한 목적으로 적용하는 개발체계이다.
해당 내용은 KISA에서 발간하는 취약점 진단 가이드 항목을 기준으로 작성한다.
제2절 보안기능
보안기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 부적절하게 구현시 발생할 수 있는 보안 약점으로 적절한 인증 없는 중요기능 허용, 부적절한 인가 등이 포함된다.
2. 부적절한 인가
가. 개요
프로그램이 모든 가능한 실행경로에 대해서 접근제어를 검사하지 않거나 불완전하게 검사하는 경우, 공격자는 접근 가능한 실행경로를 통해 정보를 유출할 수 있다.
나. 보안대책
응용프로그램이 제공하는 정보와 기능을 역할에 따라 배분함으로써 공격자에게 노출되는 공격노 출면 (Attack Surface)을 최소화하고 사용자의 권한에 따른 ACL(Access Control List)을 관리한다. JAAS Authorization Framework나 OWASP ESAPI Access Control 등의 프레임워크 를 사용해서 취 약점을 제거할 수도 있다.
다. 코드예제
아래의 코드는 사용자 입력값에 따라 삭제작업을 수행하고 있으며, 사용자의 권한확인을 위한 별도 의 통제가 적용되지 않고 있다.
- 안전하지 않은 코드의 예 JAVA -
1: private BoardDao boardDao;
2: String action = request.getParameter("action");
3: String contentId = request.getParameter("contentId");
//요청을 하는 사용자의 delete 작원 권한 확인 없이 수행하고 있어 안전하지 않다.
4: if (action != null && action.equals("delete")) {
5: boardDao.delete(contentId);
6: }
- 안전한 코드의 예 JAVA -
아래의 코드처럼 세션에 저장된 사용자 정보를 통해 해당 사용자가 삭제작업을 수행할 권한이 있는지 확인한 뒤 권한이 있는 경우에만 수행하도록 해야 한다.
1: private BoardDao boardDao;
2: String action = request.getParameter("action");
3: String contentId = request.getParameter("contentId");
// 세션에 저장된 사용자 정보를 얻어온다.
4: User user= (User)session.getAttribute("user");
// 사용자정보에서 해당 사용자가 delete작업의 권한이 있는지 확인한 뒤 삭제 작업을 수행한다.
5: if (action != null && action.equals("delete") && checkAccessControlList(user,action)) {
6: boardDao.delete(contenId);
7: }
8: }
라. 진단방법
해당 취약점은 보안특성 중 외부 시스템(웹서버, DB서버, LADP 등)의 권한 설정과 관련된 취약점 으로 정적도구를 사용하여 이를 판단하는 것은 쉽지 않다.
먼저 중요정보를 저장할 수 있는 외부시스템이 존재하는지 식별하고 해당시스템에 접근(열람) 및 변경(생성․삭제․수정 등)에 대한 권한을 사전에 적절하게 정의하였는지 확인한다. 해당 정보 또는 기능(접근․변경)을 호출하는 함수에서, 사전에 정의한 권한 소유여부를 검사하는지 확인(①)한다. 또한 접근제어를 서버측이 아닌 JavaScript 등과 같이 클라이언트측 에서 제어 하여 우회가 가능한지 확인한다.
1: public void f(String sSingleId, int iFlag, String sServiceProvider, String sUid, String
sPwd) {
2: …
3: env.put(Context.INITIAL_CONTEXT_FACTORY, CommonMySingleConst.INITCTX);
4: env.put(Context.PROVIDER_URL, sServiceProvider);
5: // 익명으로 LDAP 인증을 사용
6: env.put(Context.SECURITY_AUTHENTICATION, “none”);----------------①
7: env.put(Context.SECURITY_PRINCIPAL, sUid);
8: env.put(Context.SECURITY_CREDENTIALS, sPwd);
9: …
- 정탐코드의 예 -
외부의 입력인 name 값이 필터가 아닌 동적인 LDAP 쿼리문 에서 사용자명으로 사용되었으며, 사용자 인증을 위한 별도의 접근제어 방법이 사용되지 않고 있다. 이는 anonymous binding을 허용 하는 것으로 볼 수 있다. 따라서 임의 사용자의 정보를 외부에서 접근할 수 있게 된다.
1: public void f(String sSingleId, int iFlag, String sServiceProvider, String sUid, String
sPwd) {
2: …
3: env.put(Context.INITIAL_CONTEXT_FACTORY, CommonMySingleConst.INITCTX);
4: env.put(Context.PROVIDER_URL, sServiceProvider);
5: // 익명으로 LDAP 인증을 사용
6: env.put(Context.SECURITY_AUTHENTICATION, “none”);
7: env.put(Context.SECURITY_PRINCIPAL, sUid);
8: env.put(Context.SECURITY_CREDENTIALS, sPwd);
9: …
10: }
- 오탐코드의 예 -
아래의 코드처럼 세션에 저장된 사용자 정보를 통해 해당 사용자가 삭제작업을 수행할 권한이 있는지 확인한 뒤 권한이 있는 경우에만 수행하도록 해야 한다.
1: public String doSometing(HttpServletRequest request, HttpServletResponse response,
HttpSession session) {
2: String action= request.getParameter(“action”);
3: // 세션에 저장된 사용자 정보를 얻어온다.
4: User user= (User)session.getAttribute(“user”);
5:
6: // 사용자정보에서 해당 사용자가 delete작업의 권한이 있는지 확인한 뒤 삭제 작업을 수행한다.
7: if (action != null && action.equals(“delete”) && checkAccessControlList(user,action))
{
8: // 삭제작업을 수행한다.
9: }
10: }
'보안 공부 > 소스코드 보안약점 진단' 카테고리의 다른 글
소스코드 보안약점 진단 - 취약한 암호화 알고리즘 사용 (0) | 2022.01.05 |
---|---|
소스코드 보안약점 진단 - 중요한 자원에 대한 잘못된 권한 설정 (0) | 2022.01.04 |
소스코드 보안약점 진단 - 적절한 인증 없는 중요기능 허용 (0) | 2021.12.31 |
소스코드 보안약점 진단 - 포맷 스트링 삽입 (0) | 2021.12.30 |
소스코드 보안약점 진단 - 메모리 버퍼 오버플로우 (0) | 2021.12.29 |