본문 바로가기

📤 Public 메서드의 Private 배열 반환 - 실습 시뮬레이터

CWE-495: Private Data Structure Returned From a Public Method

KISA 소프트웨어 보안약점 진단가이드(2021) · 캡슐화
💡 쉽게 말하면
내부 장부(배열)를 원본 그대로 건네주면 받은 사람이 내 것을 고칠 수 있습니다. 복사본을 줍니다.
✅ 학습 진행도
  • ⬜ 진단 시작
  • ⬜ 내부 참조 반환 식별
  • ⬜ 방어적 복사
☕ Java 코드 에디터 취약한 코드
Account.java 💡 내부 배열은 clone()/복사본으로 반환하세요.
public class Account {
    private int[] transactions;
    // [취약] 내부 배열 참조를 그대로 반환 → 외부에서 내부 상태 변경 가능
    public int[] getTransactions() {
        return transactions;
    }
}
💡 수정 가이드 (KISA 기준)
1. 방어적 복사

복사본을 반환.

public int[] getTransactions() { return transactions.clone(); // 방어적 복사 }
📊 분석 결과 및 설명
🎯 목표

내부 가변 배열은 복사본으로 반환하여 캡슐화를 지킵니다.

⚠️ 현재 취약점

Private Array Exposure

내부 참조 반환으로 외부에서 상태를 변경할 수 있습니다.

✅ 학습 진행도
  • ⬜ 진단 시작
  • ⬜ 내부 참조 반환 식별
  • ⬜ 복사본 반환
🐍 Python 코드 에디터 취약한 코드
account.py 💡 내부 리스트는 복사본(list()/[:])으로 반환하세요.
class Account:
    def __init__(self):
        self._transactions = []
    # [취약] 내부 리스트 참조를 그대로 반환 → 외부에서 직접 수정 가능
    def get_transactions(self):
        return self._transactions
💡 수정 가이드 (KISA 기준)
1. 방어적 복사

복사본 반환.

def get_transactions(self): return list(self._transactions) # 복사본
📊 분석 결과 및 설명
🎯 목표

내부 가변 컬렉션은 복사본으로 반환합니다.

⚠️ 현재 취약점

Private List Exposure

내부 참조 반환으로 외부에서 상태가 변경됩니다.

📰 실제 사고사례 & 표준 매핑
Private 배열의 참조를 그대로 반환해 외부에서 내부 데이터를 변조할 수 있는 캡슐화 결함입니다.
🏷️ CWE-495
※ 공개적으로 알려진 사례 기반 교육용 요약 · CWE/OWASP는 공개 표준 분류