728x90
SMALL
- 이번에는 보안 약점 및 취약점, 그리고 시큐어 코딩에 대한 내용입니다.
시큐어 코딩
- 소프트웨어 개발 단계(SDLC)에서 보안 약점과 보안 취약점을 제거함으로써 해킹 위험성을 줄이는 프로그래밍 기법
- 보안 약점: 설계, 구현 단계에서 발생하는 에러 (예: CWE)
- 보안 취약점: 해커가 시스템 및 네트워크에 접근해 사용할 수 있는 SW의 실수 (예: CVE)
시큐어 개발 생명주기
- 시큐어 SDLC 요구사항 정의 단계
- 보안 목표 정의 및 보안 취약점, 영향도 분석하는 단계
- 시큐어 SDLC 분석/설계 단계
- 보안 아키텍쳐를 설계하고 보안 요구사항을 정의하는 단계
- 개발자 교육 실시 및 보안 테스트 계획 설계
- 시큐어 SDLC 코딩 단계
- 코딩 규칙 정의 후 개발된 코드에 대한 정적 단위 테스트 실시
- 사전 정의한 시큐어 코딩 규칙의 준수 여부 검증
- 시큐어 SDLC 테스팅 단계
- 동적 단위 테스트 실시, 응용 프로그램의 사용성 테스트 수행
- 시큐어 SDLC 유지보수 단계
- 변경 시 보안 영향도 평가 수행, 주기적인 취약성 점검 수행
시큐어 코딩 주요기법
JAVA
SQL 삽입 공격 대응을 위한 기법
- 공격 개요
- DB와 연동된 응용 프로그램에서 입력된 데이터에 대한 유효성 검증을 하지 않을 경우, 공격자가 입력 폼 및 URL 입력란에 SQL문을 삽입하여 DB가 무단으로 열람되는 보안 약점
- 코딩 기법
- PreparedStatement 객체 등을 이용하여 DB에 컴파일된 쿼리문을 전달하는 방법 사용
- 외부 입력값에 대해 특수문자 및 쿼리 예약어 필터링 가능
- 프레임워크와 연동하여 사용하는 경우 검증 모듈 및 보안 모듈을 적절히 사용 가능
// 안전하지 않은 코드
String userId = request.getParameter("userId");
String sql = "SELECT * FROM users WHERE user_id = '" + userId + "'";
Connection conn = db.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
// 이 경우 외부 입력값 userId에 "abc' OR '1'='1" 을 넣으면
// 조건이 항상 참이 되어 전체 테이블 조회
// 안전한 코드
String userId = request.getParameter("userId");
String sql = "SELECT * FROM users WHERE user_id = ?";
Connection conn = db.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, userId);
ResultSet rs = pstmt.executeQuery();
// PreparedStatement를 사용하여 쿼리문을 작성하면,
// 외부 입력값이 SQL 구조에 영향을 주지 않아 SQL 인젝션 방지
크로스 사이트 스크립팅(XSS) 공격 대응을 위한 기법
- 공격 개요
- 웹에 악의적인 스크립트를 포함시켜 사용자 측에서 실행되게 유도
- 부적절한 스크립트가 수행되어 정보 유출 등의 공격 유발
- 코딩 기법
- 외부 입력값에 스크립트가 삽입되지 못하도록 문자 변환 함수 및 메소드를 사용
- 허용되는 HTML 태그들을 화이트 리스트로 만들어 해당 태그만 지원하도록 설계
운영체제 명령어 삽입 공격 대응을 위한 기법
- 공격 개요
- 공격자 입력값이 운영체제 명령어의 일부 또는 전부로 구성
- 의도하지 않은 시스템 명령어 실행 후 권한 변경 및 시스템 동작에 악영향
- 코딩 기법
- 서버 내부로 시스템 명령어가 전달되지 않도록 구성
- 검증 없이 시스템 내부 명령어 사용 금지
// 안전하지 않은 코드
String command = args[0]; // 사용자 입력을 그대로 사용
Runtime.getRuntime().exec(command); // 위험: 입력값을 그대로 명령어로 실행하여 보안 취약
// 안전한 코드
List<String> allowedCommands = Arrays.asList("notepad", "calc");
String command = args[0];
if (allowedCommands.contains(command)) {
Runtime.getRuntime().exec(command); // 허용된 명령어만 실행하여 안전성 확보
} else {
System.out.println("허용되지 않은 명령어");
}
파일 업로드 공격 대응을 위한 기법
- 공격 개요
- 서버 측 실행 가능한 스크립트 파일이 업로드 가능하고, 웹을 통해 직접 실행할 수 있는 경우 발생
- 코딩 기법
- 화이트 리스트 방식으로 허용된 확장자만 업로드 허용
- 파일 실행 여부를 설정 가능한 경우, 실행 속성 제거
C
메모리 버퍼 오버플로우 공격 대응을 위한 기법
- 공격 개요
- 할당된 메모리의 범위를 넘어선 위치의 자료를 읽거나 쓰려고 할 때 발생
- 프로그램 오동작 유발 및 악의적인 코드 실행 가능
- 코딩 기법
- 적절한 버퍼의 크기를 설정
- NULL 문자를 버퍼 범위 내에 삽입하여 NULL 문자로 종료되도록 함
// 안전하지 않은 코드
typedef struct {
char x[16];
void *y;
void *z;
} charvoid;
void badCode() {
charvoid cv_struct;
memcpy(cv_struct.x, "SRC_STRING", sizeof(cv_struct)); // 잘못된 크기 사용으로 버퍼 오버플로우 위험
printf("%s\\n", cv_struct.x); // 예기치 않은 데이터 복사로 인한 문제 발생 가능
}
// 안전한 코드
typedef struct {
char x[16];
void *y;
void *z;
} charvoid;
void goodCode() {
charvoid cv_struct;
memcpy(cv_struct.x, "SRC_STRING", sizeof(cv_struct.x)); // 정확한 크기 사용으로 버퍼 오버플로우 방지
cv_struct.x[sizeof(cv_struct.x) - 1] = '\\0'; // Null 문자로 문자열 종료 보장
printf("%s\\n", cv_struct.x);
}
포맷 스트링 삽입 공격 대응을 위한 기법
- 공격 개요
- 외부 입력값을 입출력 함수의 포맷 문자열로 그대로 사용하는 경우 발생
- 코딩 기법
- 사용자 입력값을 직접 포맷 문자열로 사용하거나 포맷 문자열 생성에 미포함
- 사용자가 포맷 스트링을 변경할 수 없는 구조로 사용
Android-JAVA
외부 접근 가능한 컴포넌트 공격 대응을 위한 기법
- 공격 개요
- manifest.xml 파일에 **android:exported=”true”**로 설정되어 있는 컴포넌트에서 발생
- 원래 의도하지 않았던 상황에서 수행 시작하여 시스템 보안에 침해
- 코딩 기법
- 컴포넌트 접근 권한을 외부에 제공하는 않는 것이 바람직
공유 아이디에 의한 접근통제 통과 공격 대응을 위한 기법
- 공격 개요
- Manifest.xml 파일의 manifest 태그에 android:sharedUserId 속성을 설정할 경우 발생
- 같은 아이디와 서명을 사용함으로써 다른 프로그램이 해당 프로그램 정보에 접근 가능
- 코딩 기법
- 공유 아이디 설정을 하지 않는 것이 바람직
728x90
LIST
'자격증 > TOPCIT' 카테고리의 다른 글
보안관리체계와 표준 (14) | 2024.10.04 |
---|---|
정보보안 최신 기술 (8) | 2024.09.26 |
정보보안 기반기술 (15) | 2024.09.25 |
정보보안 개념 (8) | 2024.09.19 |
데이터와 데이터베이스의 이해 (8) | 2024.09.18 |