Notice
Recent Posts
Recent Comments
Link
IgnatiusHeo
구현단계 보안약점 제거 기준-신뢰할 수 없는 데이터의 역직렬화 본문
작성일: 230706
※ 본 게시글은 학습 목적으로 행정안전부·KISA의 소프트웨어 보안약점 진단 가이드, 소프트웨어 개발보안 가이드를 참고하여 작성하였습니다.
정리 내용: 소프트웨어 보안약점 진단 가이드(462~468p)
구분 | - 코드오류 |
설계단계 | |
개요 | 직렬화(Serialization)는 프로그램에서 특정 클래스의 현재 인스턴스 상태를 다른 서버로 전달하기 위해 클래스의 인스턴스 정보를 바이트 스트림으로 복사하는 작업으로, 메모리 상에서 실행되고 있는 객체의 상태를 그대로 복제하여 파일로 저장하거나 수신측에 전달하게 된다. 역직렬화(Deserialization)는 반대 연산으로 바이너리 파일이나 바이트 스트림으로부터 객체 구조로 복원하게 된다. 이 때, 송신자가 네트워크를 이용하여 직렬화된 정보를 수신자에게 전달하는 과정에서 공격자가 전송 또는 저장된 스트림을 조작할 수 있는 경우에는 신뢰할 수 없는 역직렬화를 이용하여 무결성 침해, 원격 코드 실행, 서비스 거부 공격 등이 발생 할 수 있는 보안약점이다. |
진단 세부사항 (설계단계) |
|
보안대책 (구현단계) |
초기화되지 않은 스택 메모리 영역의 변수는 임의값이라 생각해서 대수롭지 않게 생각할 수 있으나 사실은 이전 함수에서 사용되었던 내용을 포함하고 있다. 공격자는 이러한 약점을 사용하여 메모리에 저장되어 있는 값을 읽거나 특정 코드를 실행할 수 있다. 모든 변수를 사용 전에 반드시 올바른 초기 값을 할당함으로서 이러한 문제를 예방한다. 신뢰할 수 없는 데이터를 역직렬화 하지 않도록 응용프로그램을 구성한다. 민감정보 또는 중요정보를 전송 시 암호화 통신을 적용하지 못하는 경우, 송신 측에서 서명을 추가하고 수신 측에서 서명을 확인하여 데이터의 무결성을 검증한다. 또는, 신뢰할 수 있는 데이터의 식별을 위해 역직렬화 대상의 데이터가 사전에 검증된 클래스만을 포함하는지 검증하거나, 제한된 실행 권한을 구성하여 역직렬화 코드를 실행한다. |
진단방법 (구현단계) |
① java.io.ObjectInputStream.readObject()와 같이 각 언어에서 제공하는 역직렬화 함수를 확인하고 ② 해당 역직렬화 함수에서 사용하는 데이터가 신뢰할 수 있는 값인지 확인한다. 만약 사용자 입력 값, 소켓으로 입력받은 값 등 출처를 신뢰할 수 없는 데이터를 검증하는 절차가 없으면 취약하다고 판정한다. |
다. 코드예제
ㅇ 분석
1;public static void main(String[] args) throws
2:IOException, GeneralSecurityException, ClassNotFoundException {
3: ....
4: // map을 역직렬화 한다.
5: ObjectInputStream in = new ObjectInputStream(new FileInputStream("data"));
6: sealedMap = (SealedObject) in.readObject();
7: in.close();
8:
9: // 객체를 추출한다.
10: cipher = Cipher.getInstance("AES");
11: cipher.init(Cipher.DECRYPT_MODE, key);
12: signedMap = (SignedObject) sealedMap.getObject(cipher);
13:
14: // 서명값 검증 과정에서 불일치 시 예외를 리턴하고, 일치 시 map 값을 읽는다.
15: if (!signedMap.verify(kp.getPublic(), sig)) {
16: throw new GeneralSecurityException("Map failed verification");
17: }
18: map = (SerializableMap<String, Integer>) signedMap.getObject();
19:}
ㅇ 내용
1. 데이터를 받아서 -> 역직렬화 -> 복호화를 해서 -> signedMap을 추출 -> sig랑 비교하는 건데
2. 역직렬화 하기 전에 다이제스트 검사를 해야하나? 이건 분석이나 수정 코드가 이상함
ㅇ 분석
1: class DeserializeExample {
2: public static Object deserialize(byte[] buffer)
3: throws IOException, ClassNotFoundException {
4: Object ret = null;
5: try (ByteArrayInputStream bais = new ByteArrayInputStream(buffer)) {
6: try (ObjectInputStream ois = new ObjectInputStream(bais)) {
7: ret = ois.readObject();
8: }
9: }
10: return ret;
11: }
12:}
ㅇ 내용
1. 이것도 읽기 전에 검증하고 읽어야하는듯함
ㅇ 수정
1:public class WhitelistedObjectInputStream extends ObjectInputStream {
2: public Set<String> whitelist;
3: // WhilelistedObjectInputStream을 생성할 때 화이트리스트를 입력받는다.
4: public WhitelistedObjectInputStream(InputStream inputStream, Set<String> wl)
5: throws IOException {
6: super(inputStream);
7: whitelist = wl;
8: }
9:
10:@Override
11:protected Class<?> resolveClass(ObjectStreamClass cls) throws IOException,
ClassNotFoundException {
12: // ObjectStreamClass의 클래스명이 화이트리스트에 있는지 확인한다.
13: if (!whitelist.contains(cls.getName())) {
14: throw new InvalidClassException("Unexpected serialized class", cls.getName());
15: }
16: return super.resolveClass(cls);
17: }
18:}
19:
20:@RequestMapping(value = "/upload", method = RequestMethod.POST)
21:public Student upload(@RequestParam("file") MultipartFile multipartFile)
throws ClassNotFoundException, IOException {
22: Student student = null;
23: File targetFile = new File("/temp/" + multipartFile.getOriginalFilename());
24: // 역직렬화 대상 클래스 이름의 화이트리스트 생성한다.
25: Set<String> whitelist = new HashSet<String>(Arrays.asList(
26: new String[] {
27: "Student"
28: }));
29: try (InputStream fileStream = multipartFile.getInputStream()) {
30: try (WhitelistedObjectInputStream ois =
31: new WhitelistedObjectInputStream(fileStream, whitelist)) {
32: // 화이트리스트에 없는 역직렬화 데이터의 경우 예외 발생시킨다.
33: student = (Student) ois.readObject();
34: }
35: }
36: return student;
37:}
ㅇ 내용
끝.
'자격 > SW보안약점진단원' 카테고리의 다른 글
구현단계 보안약점 제거 기준-제거되지 않고 남은 디버그 코드 (0) | 2023.07.06 |
---|---|
구현단계 보안약점 제거 기준-잘못된 세션에 의한 데이터 정보 노출 (0) | 2023.07.06 |
구현단계 보안약점 제거 기준-초기화되지 않은 변수 사용 (0) | 2023.07.06 |
구현단계 보안약점 제거 기준-해제된 자원 사용 (0) | 2023.07.06 |
구현단계 보안약점 제거 기준-부적절한 자원 해제 (0) | 2023.07.06 |