1. 정의
적절한 인증 없는 중요기능 허용 (Missing Authentication for Critical Function)
적절한 인증과정이 없이 중요정보(계좌이체 정보, 개인정보 등)를 열람(또는 변경)할 때 발생하는 보안약점이다.
2. 해결방법
- 클라이언트의 보안검사를 우회하여 서버에 접근하지 못하도록 한다.
- 중요한 정보가 있는 페이지는 재인증이 적용되도록 설계하여야 한다.(은행 계좌이체 등)
- 안전하다고 확인된 라이브러리나 프레임워크를 사용한다. 즉 OpenSSL 이나 ESAPI 의 보안 기능을 사용한다.
3. 예제
========================== 안전하지 않은 코드의 예 ==========================
public void sendBankAccount(String accountNumber,double balance)
{
BankAccount account = new BankAccount();
account.setAccountNumber(accountNumber);
account.setToPerson(toPerson);
account.setBalance(balance);
AccountManager.send(account);
}
============================================================================
위의 예제는 재인증을 거치지 않고 계좌 이체를 하고 있다.
============================== 안전한 코드의 예 =============================
public void sendBankAccount(HttpServletRequest request, HttpSession session, String accountNumber,double balance)
{
// 재인증을 위한 팝업 화면을 통해 사용자의 credential을 받는다.
String newUserName = request.getParameter("username");
String newPassword = request.getParameter("password");
if ( newUserName == null || newPassword == null )
{
throw new MyEception("데이터오류");
}
// 세션으로부터 로긴한 사용자의 credential을 읽는다.
String password = session.getValue("password");
String userName = session.getValue("username");
// 재인증을 통해서 이체여부를 판단한다.
if ( isAuthenticatedUser() && newUserName.equal(userName) && newPassword.equal(password) )
{
BankAccount account = new BankAccount();
account.setAccountNumber(accountNumber);
account.setToPerson(toPerson);
account.setBalance(balance);
AccountManager.send(account);
}
}
============================================================================
위의 코드처럼 인증을 받은 사용자만이 다시 재인증을 거쳐 계좌 이체가 가능하도록 한다.
'04. 시큐어코딩' 카테고리의 다른 글
시큐어코딩(27) - Reliance on Untrusted Inputs in a Security Decision (0) | 2017.11.24 |
---|---|
시큐어코딩(26) - SQL Injection: Hibernate (0) | 2017.11.23 |
시큐어코딩(25) - Download of Code Without Integrity Check (0) | 2017.11.23 |
시큐어코딩(24) - Unsafe Reflection (0) | 2017.11.23 |
시큐어코딩(23) - Process Control (0) | 2017.11.23 |