소프트웨어 개발보안 가이드 분석(2021) : Public 메소드 부터 반환된 Private 배열
Public 메소드 부터 반환된 Private 배열이란?
Public 메소드를 통해 Private 배열을 직접 반환하는 행위는 객체의 캡슐화 원칙을 위배하는 문제를 발생시킵니다. 객체 내부의 상태를 외부에 노출시키지 않기 위해 접근 제어자를 사용하지만, Private 배열을 직접 반환하는 Public 메소드를 통해 객체의 내부 상태가 외부로 직접 노출되어, 외부에서 배열의 내용을 변경할 수 있게 됩니다. 이는 객체의 불변성을 심각하게 위배할 수 있으며, 프로그램이 예상치 못한 방식으로 동작하거나 보안 취약점으로 이어질 수 있습니다.
공격 메커니즘
Public 메소드로부터 반환된 Private 배열 취약점의 공격 메커니즘은 주로 다음과 같습니다.
- 내부 상태 노출: 객체의 내부 상태를 관리하기 위해 사용하는 Private 배열이 Public 메소드를 통해 직접 반환되면, 이 배열에 대한 참조가 외부로 노출됩니다.
- 외부에서의 배열 변경: 반환된 배열의 참조를 통해, 외부 코드에서 배열의 내용을 변경할 수 있게 됩니다. 객체가 의존하고 있는 내부 데이터의 무결성과 불변성을 위배합니다.
- 예기치 않은 동작 발생: 객체의 내부 상태가 외부에서 변경되면, 객체는 개발자가 의도한 대로 동작하지 않을 수 있습니다. 이로 인하여 데이터 손실, 보안 취약점 노출, 시스템의 불안정 등 다양한 문제를 야기할 수 있습니다.
- 보안 위협 발생: 공격자가 이 취약점을 악용하여 민감한 정보를 변경하거나 노출시키는 등의 보안 위협을 만들어낼 수 있습니다. 예를 들어, 권한 검사 배열을 변경하여 권한이 없는 사용자가 높은 권한의 기능을 실행할 수 있게 만들 수 있습니다.
취약한 웹 애플리케이션의 예
다음은 Private 배열을 직접 반환하는 Public 메소드가 포함된 예시 코드 입니다.
public class PrivateArrayExample {
private String[] sensitiveData;
public PrivateArrayExample(String[] data) {
this.sensitiveData = data;
}
// 취약한 점: Private 배열을 직접 반환
public String[] getSensitiveData() {
return sensitiveData;
}
}
시큐어코딩 적용 방법
Public 메소드 부터 반환된 Private 배열으로 발생할 수 있는 취약점을 보안하기 위해 다음과 같은 방법을 사용할 수 있습니다.
- 배열 복사본 반환: 객체의 Public 메소드가 내부 배열을 반환할 때, 원본 배열의 복사본을 만들어 반환합니다. 원본 배열의 복사본을 만들어 사용하게 되면 외부에서 원본 배열에 접근하거나 변경할 수 없게 됩니다.
다음은 원본 배열을 복사하여 복사본을 반환하는 코드의 예제입니다.
public class SecurePrivateArrayExample {
private String[] sensitiveData;
public SecurePrivateArrayExample(String[] data) {
this.sensitiveData = data.clone();
}
// 안전한 방법: 배열의 복사본을 반환
public String[] getSensitiveData() {
return sensitiveData.clone();
}
}
data.clone()을 통해 입력으로 받은 배열의 복사본을 생성하여 sensitiveData에 저장함으로써 외부에서 배열을 수정하더라도 객체 내부의 sensitiveData가 영향을 받지 않도록 보호하며, 동시에 sensitiveData.clone()을 사용해 sensitiveData 배열의 복사본을 반환함으로써 메소드를 통해 반환된 배열의 내용이 변경되더라도 원본 sensitiveData에는 영향을 미치지 않아,외부로 데이터를 제공하면서도 객체의 내부 상태의 불변성을 유지하는 방법입니다.