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

소스코드 보안약점 진단 - 하드코드된 비밀번호

H.J.World 2022. 1. 10. 10:10
728x90
반응형

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

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

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

 

제2절 보안기능

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


7. 하드코드된 비밀번호

가. 개요

프로그램 코드 내부에 하드코드된 패스워드를 포함하고, 이를 이용하여 내부 인증에 사용하거나 외부 컴포넌트와 통신을 하는 경우, 관리자 정보가 노출될 수 있어 위험하다. 또한, 코드 내부에 하드코드된 패스워드가 인증실패를 야기하는 경우, 시스템 관리자가 그 실패의 원인을 파악하기 쉽지 않은 단점이 있다.

나. 보안대책

패스워드는 암호화하여 별도의 파일에 저장하여 사용하고, SW 설치시 사용하는 디폴트 패스워드, 키 등을 사용하는 대신 “최초-로그인” 모드를 두어 사용자가 직접 패스워드나 키를 입력하도록 설계한다.

다. 코드예제

데이터베이스 연결을 위한 패스워드를 소스코드 내부에 상수 형태로 하드코딩 하는 경우, 접속 정보 가 노출될 수 있어 위험하다.

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

1: public class MemberDAO {
2: private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
3: private static final String URL = "jdbc:oracle:thin:@192.168.0.3:1521:ORCL";
4: private static final String USER = "SCOTT"; // DB ID;
//DB 패스워드가 소스코드에 평문으로 저장되어 있다.
5: private static final String PASS = "SCOTT"; // DB PW;
6: ……
7: public Connection getConn() {
8: Connection con = null;
9: try {
10: Class.forName(DRIVER);
11: con = DriverManager.getConnection(URL, USER, PASS);
12: ……

 

- 안전한 코드의 예 JAVA -

패스워드는 안전한 암호화 방식으로 암호화하여 별도의 분리된 공간(파일)에 저장해야 하며, 암호화된 패스워드를 사용하기 위해서는 복호화 과정을 거쳐야 한다.

1: public class MemberDAO {
2: private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
3: private static final String URL = "jdbc:oracle:thin:@192.168.0.3:1521:ORCL";
4: private static final String USER = "SCOTT"; // DB ID
5: ……
6: public Connection getConn() {
7: Connection con = null;
8: try {
9: Class.forName(DRIVER);
//암호화된 패스워드를 프로퍼티에서 읽어들어 복화해서 사용해야한다.
10: String PASS = props.getProperty("EncryptedPswd");
11: byte[] decryptedPswd = cipher.doFinal(PASS.getBytes());
12: PASS = new String(decryptedPswd);
13: con = DriverManager.getConnection(URL, USER, PASS);
14: ……

 

라. 진단방법

사용자․관리자 로그인페이지(식별․인증)를 요청하는 모듈․함수를 확인하여 사용자․관리자 패스워드 가 소스코드 안에 직접 코딩되어 있는지 확인하고 내․외부 서버(업무서버, DB 등)에 접속을 관리하는 모듈․함수를 확인하여 서버 접속 패스워드가 소스코드 안에 직접 코딩되어 있는지 확인한다.

패스워드를 별도의 파일에 저장하여 사용하지 않고 소스코드 안에 하드코딩 되어 있는 경우엔 취약 하다고 판정한다.

다음의 예제에서 데이터베이스 접속 정보인 비밀번호를 4번 라인에서 입력하고 있다.

1: private static final String JDBC_DRIVER = “org.gjt.mm.mysql.Driver”;
2: private static final String JDBC_URL = “jdbc:mysql://192.168.200.24:1621/com”;
3: private static final String JDBC_USER = “com”;
4: private static final String JDBC_PASSWORD = “com01”;
5: ...
6: public Connection DBConnect(String url, String id) {
7: try {
8: conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);
9: } catch (SQLException +
e)
{ System.err.println(“
…”);
10: }
11: return conn;
12: }
728x90
반응형