IgnatiusHeo

구현단계 보안약점 제거 기준-적절한 인증 없는 중요기능 허용 본문

자격/SW보안약점진단원

구현단계 보안약점 제거 기준-적절한 인증 없는 중요기능 허용

Ignatius Heo 2023. 7. 4. 19:13

작성일: 230704

 

※ 본 게시글은 학습 목적으로 행정안전부·KISA의 소프트웨어 보안약점 진단 가이드, 소프트웨어 개발보안 가이드를 참고하여 작성하였습니다.

 

정리 내용: 소프트웨어 보안약점 진단 가이드(314~318p)

구분 - 보안기능
설계단계 - 인증 대상 및 방식
https://cryptocurrencyclub.tistory.com/100
개요
적절한 인증과정이 없이 중요정보(계좌이체 정보, 개인정보 등)를 열람(또는 변경)할 때 발생하는 보안약점이다.

진단 세부사항
(설계단계)
 
 ① 중요기능이나 리소스에 대해서는 인증 후 사용 정책이 적용되어야 한다. 중요기능은 안전한 인증방식을 사용하여 인증 후 사용하도록 설계하고 인증이 수행되도록 설계되어 있는지 확인한다.
  ㅇ  중요기능과 중요 리소스에 대한 접근 권한이 분류되어 있는지 확인
  ㅇ  접근권한을 기반으로 인증이 요구되는 중요 기능이나 리소스가 분류되어 있는지 확인
  ㅇ  인증 누락이 발생하지 않도록 인증적용 방법이 안전하게 설계됐는지 확인(프레임워크 컴포넌트를 활용 및 적용, 인증 누락이 발생하지 않도록 설정)
  ㅇ  중요 기능, 리소스에 대한 접근통제가 수행되고 있는지 점검하기 위한 테스트 계획 수립 여부 확인
 
 ② 안전한 인증방식을 사용하여 인증우회나 권한 상승이 발생하지 않도록 해야 한다. 안전한 인증방식을 사용하여 인증 후 사용하도록 설계되어 있는지 확인한다.
  ㅇ  인증기능 설계 시 안전한 인증방식을 사용하도록 설계되어 있는지 확인(Type1/ Type2 / Type3)
  ㅇ  인증정보의 저장방식이 안전하게 설계되어 있는지 확인(인증 사용값은 안전하게 암호화되어 서버에 저장되어야 함)
  ㅇ  인증에 대한 인증횟수 제한 및 오류처리기능의 설계 여부 확인
  ㅇ  인증오류 또는 인증실패에 대한 로깅의 설계 여부 확인(인증시도를 추적할 수 있는 인증시도시간/IP/ID정보 등 포함 여부 확인)
 
 ③ 중요기능에 대해 2단계(2-factor)인증을 고려해야 한다. 중요기능은 안전한 인증방식을 사용하여 인증 후 사용하도록 설계하고 2단계 인증 등 보안을 강화하는 방법을 고려해야 한다.
  ㅇ  개인정보변경, 비밀번호 재설정, 권한 관리, 관리자 기능과 같은 중요기능의 경우 추가인증을 요청하도록 설계되었는지 확인
  ㅇ  추가 인증기능 설계시 안전한 인증방식이 사용되도록 설계되어 있는지 확인
  →  ID/PW 또는 OTP, 멀티디바이스를 이용한 추가 인증, (공인/사설) 인증서, 바이오정보(지문, 홍채 등)
  ㅇ  추가인증이 요구되는 중요기능을 사용하거나 해당 인증을 실패하는 경우 사용시간, IP주소, ID정보, 사용기능 등이 로깅되도록 설계되었는지 확인

보안대책
(구현단계)

클라이언트의 보안검사를 우회하여 서버에 접근하지 못하도록 설계하고 중요한 정보가 있는 페이지는 재인증을 적용(은행 계좌이체 등)한다.

또한 안전하다고 검증된 라이브러리나 프레임워크(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:}

ㅇ 내용

1.  회원정보를 변경하는 코드같아 보임

2. 회원정보를 수정하기 위해 로그인한 사용자 userId와 실제 정보를 수정하기 위한 memberModel이 상이할 수 있음. 즉, 일반 회원이 회원정보 기능 수정 페이지에 접속해서 admin의 계정 정보를 수정할 수 있음

 

ㅇ 수정

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. r7에서 requestUser와 수정하고자 하는 userId의 동일 여부를 확인함


ㅇ 분석

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

ㅇ 내용

1. 왜 로그인 버튼에 로그인 관련 내용이 없이 로그인 권한 할당함?

 

ㅇ 수정

1: protected void LoginButton_Click(object sender, EventArgs e) {
// 사용자의 자격인증 과정을 수행합니다.
2: if(Membership.ValidateUser(UserName.Text, Password.Text)) {
FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked);
3: }
4:}

ㅇ 내용

1. if문에 ValidateUser가 로그인 기능인가봄

 

 

 

 

 

끝.