보안 공부/소스코드 보안약점 진단

소스코드 보안약점 진단 - 적절한 인증 없는 중요기능 허용

H.J.World 2021. 12. 31. 10:10
728x90
반응형

소스코드 보안약점 진단 // 소프트웨어 보안약점 진단 // SW 보안약점 진단과 같이 다양한 이름으로 불리는 진단 과업 중 하나이다.

SW개발보안은 해킹 등 사이버공격의 원인인 보안약점을 SW개발단계에서 사전에 제거하고 SW 개발 생명주기의 각 단계별로 수행하는 일련의 보안활동을 통하여 안전한 SW를 개발·운영하기 위한 목적으로 적용하는 개발체계이다.

해당 내용은 KISA에서 발간하는 취약점 진단 가이드 항목을 기준으로 작성한다.

 

제2절 보안기능

보안기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 부적절하게 구현시 발생할 수 있는 보안 약점으로 적절한 인증 없는 중요기능 허용, 부적절한 인가 등이 포함된다.


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

가. 개요

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

나. 보안대책

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

다. 코드예제

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

- 안전하지 않은 코드의 예 JAVA -

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:}

 

- 안전한 코드의 예 JAVA -

로그인한 사용자와 요청한 사용자의 일치 여부를 확인한 후 회원정보를 수정하도록 한다.

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");
//2. 회원정보를 실제 수정하는 사용자와 로그인 사용자와 동일한지 확인한다.
6: String requestUser = memberModel.getUserId();
7: if (userId != null && requestUser != null && !userId.equals(requestUser)) {
8: mav.addObject("errCode", 1);
9: mav.addObject("member", memberModel);
10: mav.setViewName("/board/member_modify");
11: return mav;
12: }
13: ...
//3. 동일한 경우에만 회원정보를 수정해야 안전하다.
14: if (service.modifyMember(memberModel)) {
...

 

라. 진단방법

해당 취약점은 보안특성 중 개인정보와 관련된 취약점으로 정적도구를 사용하여 이를 판단하는 것은 쉽지 않다. 이에 따라 진단원이 직접 코드를 보며 해당 정보가 중요정보인지 파악해야한다. 패스워드, 개인정보(주민등록번호, 여권번호, 외국인 식별번호 등), 금융정보(카드번호, 계좌정보 등) 게시글 수정, 삭제 등을 포함하여 접근 및 사용이 제한되어야 하는 중요정보 및 기능을 정의하였는지 확인 하고 사용여부를 확인한다(①). 중요정보를 사용하는 경우 접근 변경 시 적절한 인증 여부를 확인하여 허용하는 기능이 구현되었는지 확인(②)한다. 만약 적절한 인증여부를 확인하는 경우 안전 하다고 판단하고, 인증여부를 확인하지 않는 경우 취약하다고 판단한다.

1: …
2: @Controller
3: @RequestMapping(“bbs”)
4: public class BbsController {
5: @Autowired
6: private BoardDao boardDao;
7: @RequestMapping(“delete”)
8: public String delete(@Requestparam(“contentid”) int contentId, HttpServletRequest
reques, Map model) {
9: if(request.getSession().getAttribute(“isLogin”) == “logined”) {----②
10: boardDao.delete(contenId);-----------------------------------①
11: }
12: …

 

- 정탐코드의 예 -

다음의 예제에서는 재인증을 거치지 않고 계좌이체를 하고 있으므로 취약하다고 판정한다.

1: public void sendBankAccount(String accountNumber,double balance) {
2: …
3: BankAccount account = new BankAccount();
4: account.setAccountNumber(accountNumber);
5: account.setToPerson(toPerson);
6: account.setBalance(balance);
7: AccountManager.send(account);
8: …
9: }

 

- 정탐코드의 예 -

다음의 예제에서는 클라이언트 측에서 인증을 수행 하고 있어 우회가 가능하므로 취약하다고 판정 한다

1: <script type=’text/javascript’>
2: if (${command.allowedIp} == false) {
3: document.write(“”Check Administrator IP …””);
4: alert(“”권한이 없습니다.””)
5: history.back(-1);
6: }

 

728x90
반응형