Notice
Recent Posts
Recent Comments
Link
IgnatiusHeo
구현단계 보안약점 제거 기준-적절한 인증 없는 중요기능 허용 본문
작성일: 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가 로그인 기능인가봄
끝.
'자격 > SW보안약점진단원' 카테고리의 다른 글
구현단계 보안약점 제거 기준-중요한 자원에 대한 잘못된 권한 설정 (0) | 2023.07.04 |
---|---|
구현단계 보안약점 제거 기준-부적절한 인가 (0) | 2023.07.04 |
구현단계 보안약점 제거 기준-포맷 스트링 삽입 (0) | 2023.07.04 |
구현단계 보안약점 제거 기준-메모리 버퍼 오버플로우 (0) | 2023.07.04 |
구현단계 보안약점 제거 기준-보안기능 결정에 사용되는 부적절한 입력값 (0) | 2023.07.04 |