본문 바로가기

IT정보/SW보안약점 진단원

구현단계 보안 약점 중 확인 사항

1. 부적절한 인가

 

가. 개요
프로그램이 모든 가능한 실행경로에 대해서 접근제어를 검사하지 않거나 불완전하게 검사하는 경우, 공격자는 접근 가능한 실행경로 정보를 유출할 수 있다.


나. 보안대책
응용프로그램이 제공하는 정보와 기능을 역할에 따라 배분함으로써 공격자에게 노출되는 공격노출면15) (Attack Surface)을 최소화하고 사용자의 권한에 따른 ACL(Access Control List)을 관리한다. JAAS Authorization Framework나 OWASP ESAPI Access Control 등의 프레임워크를 사용해서 취약점을 제거할 수도 있다.

 

외부의 입력인 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: 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: }

 


2. 부적절한 인증서 유효성 검증

가. 개요
인증서를 확인하지 않거나 인증서 확인 절차를 적절하게 수행하지 않아, 악의적인 호스트에 연결되거나 신뢰할 수 없는 호스트에서 생성된 데이터를 수신하게 되는 보안약점이다.

 

나. 보안대책

인증서를 사용하기 전에 인증서의 유효성을 확인한다. 인증서의 Common Name과 실제 호스트가 일치하는지, 신뢰된 발급기관(CA, RootCA)의 서명 여부, 인증서의 유효기간, 인증서의 해지여부, 안전한 암호화 알고리즘 사용 여부 확인 등으로 유효한 인증서인지 검증하는 절차를 구현하여야 한다.

아래 예제는 SSL_get_verify_result의 결과값이 X509_V_ERR_SELF_
SIGNED_CERT_IN_CHAIN인 경우에 자체 서명된 인증서이다. 이 경우, 해당 어플리케이션이 악의적인
행위를 할 수 있다.

1:if ((cert = SSL_get_peer_certificate(ssl)) && host)
2:foo=SSL_get_verify_result(ssl);
3:if ((X509_V_OK==foo) ||X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN==foo))
// 자체 서명된 인증서일 수 있다.



아래 예제는 인증서 검증결과 X509_V_OK로 반환되더라도 호스트가 Common Name과 일치하는지
확인하지 않으므로 인증서가 허가된 호스트용이라는 것을 확신할 수 없다.

1:cert = SSL_get_peer_certificate(ssl);
2:if (cert && (SSL_get_verify_result(ssl)==X509_V_OK)) {
3:/* CN 을 확인하지 않았지만 신뢰하고 진행한다. 이럴 경우, 공격자가 Common Name을
www.attack.com으로 설정하여 중간자 공격에 사용할 경우 데이터가 중간에서 복호화 되고 있음을
탐지하지 못한다. */
4: }

3. 적절한 인증 없는 중요기능 허용

가. 개요
적절한 인증과정이 없이 중요정보(계좌이체 정보, 개인정보 등)를 열람(또는 변경)할 때 발생하는 보안약점이다.


나. 보안대책
클라이언트의 보안검사를 우회하여 서버에 접근하지 못하도록 설계하고 중요한 정보가 있는 페이지는 재인증을 적용(은행 계좌이체 등)한다. 또한 안전하다고 검증된 라이브러리나 프레임워크(OpenSSL이나 ESAPI의 보안기능 등)를 사용하는 것이 중요하다.

회원정보 수정시 수정을 요청한 사용자와 로그인한 사용자의 일치 여부를 확인하지 않고 처리하고 있다.

1: @RequestMapping(value = "/modify.do", method = RequestMethod.POST)
2: public ModelAndView memberModifyProcess(@ModelAttribute("MemberModel")
MemberModel memberModel, BindingResult result, HttpServletRequest request,
HttpSession session) {
3: ModelAndView mav = new ModelAndView();
//1. 로그인한 사용자를 불러온다.
4: String userId = (String) session.getAttribute("userId");
5: String passwd = request.getParameter("oldUserPw");
6: ...
//2. 실제 수정하는 사용자와 일치 여부를 확인하지 않고, 회원정보를 수정하여 안전하지 않다.
7: if (service.modifyMember(memberModel)) {
8: mav.setViewName("redirect:/board/list.do");
9: session.setAttribute("userName", memberModel.getUserName());
10: return mav;
11: } else {
12: mav.addObject("errCode", 2);
13: mav.setViewName("/board/member_modify");
14: return mav;
15: }
16:}

사용자 자격인증 없이 로그인 기능을 수행하는 C# 코드의 예제이다.

1: protected void LoginButton_Click(object sender, EventArgs e) {
// 사용자의 자격인증 과정이 없이 로그인 기능을 수행합니다.
2: FormsAuthentication.RedirectFromLoginPage(UserName.Text,RememberMe.Checked);
3: }

라. 진단방법


해당 취약점은 보안특성 중 개인정보와 관련된 취약점으로 정적도구를 사용하여 이를 판단하는 것은 쉽지 않다.

이에 따라 진단원이 직접 코드를 보며 해당 정보가 중요정보인지 파악해야한다. 비밀번호, 개인정보(주민등록번호, 여권번호, 외국인 식별번호 등), 금융정보(카드번호, 계좌정보 등) 게시글 수정, 삭제 등을 포함하여 접근 및 사용이 제한되어야 하는 중요정보 및 기능을 정의하였는지 확인 하고 사용여부를 확인한다(①).

 

중요정보를 사용하는 경우 접근 변경 시 적절한 인증 여부를 확인하여 허용 하는 기능이 구현되었는지 확인(②)한다.

만약 적절한 인증여부를 확인하는 경우 안전 하다고 판단하고, 인증여부를 확인하지 않는 경우 취약하다고 판단한다.


 

'IT정보 > SW보안약점 진단원' 카테고리의 다른 글

SW보안약점 진원원 시험 공부  (0) 2023.09.15
4.1 세션 통제  (0) 2023.09.05
3.1 예외처리  (0) 2023.09.03
2.8 중요정보 전송  (0) 2023.09.02
2.7 중요정보 저장  (0) 2023.08.25