본문 바로가기

🧷 잘못된 세션에 의한 데이터 정보 노출 - 실습 시뮬레이터

CWE-488: Exposure of Data Element to Wrong Session

KISA 소프트웨어 보안약점 진단가이드(2021) · 캡슐화
💡 쉽게 말하면
모두가 공유하는 칠판(공유 필드)에 내 정보를 적으면 옆 사람에게 보입니다. 사용자별 세션에 따로 보관해야 합니다.
✅ 학습 진행도
  • ⬜ 진단 시작
  • ⬜ 공유 상태 식별
  • ⬜ 세션/지역변수 격리
☕ Java 코드 에디터 취약한 코드
AccountServlet.java 💡 상태를 인스턴스 필드가 아닌 지역변수/HttpSession에 저장하세요.
public class AccountServlet extends HttpServlet {
    // [취약] 인스턴스 필드는 모든 요청/사용자가 공유 → 타 사용자 정보 노출
    private String currentUser;
    protected void doGet(HttpServletRequest req, HttpServletResponse res) {
        currentUser = req.getParameter("user");
        res.getWriter().println(loadBalance(currentUser));
    }
}
💡 수정 가이드 (KISA 기준)
1. 상태 격리

공유 필드 제거, 세션 사용.

protected void doGet(HttpServletRequest req, HttpServletResponse res) { String user = req.getParameter("user"); // 요청 지역변수 req.getSession().setAttribute("user", user); // 사용자별 세션 res.getWriter().println(loadBalance(user)); }
📊 분석 결과 및 설명
🎯 목표

멀티스레드 환경에서 사용자별 데이터를 공유 필드가 아닌 세션/지역변수에 보관합니다.

⚠️ 현재 취약점

Wrong-Session Data Exposure

공유 인스턴스 필드로 동시 사용자 정보가 교차 노출됩니다.

✅ 학습 진행도
  • ⬜ 진단 시작
  • ⬜ 전역 상태 식별
  • ⬜ 세션 격리
🐍 Python 코드 에디터 취약한 코드
app.py 💡 모듈 전역 변수 대신 요청별 session을 사용하세요.
# [취약] 모듈 전역 변수에 사용자 상태 저장 → 동시요청 교차 노출
current_user = None
@app.route("/balance")
def balance():
    global current_user
    current_user = request.args.get("user")
    return load_balance(current_user)
💡 수정 가이드 (KISA 기준)
1. 상태 격리

전역 제거, 세션 사용.

@app.route("/balance") def balance(): user = request.args.get("user") # 요청 지역변수 session["user"] = user # 사용자별 세션 return load_balance(user)
📊 분석 결과 및 설명
🎯 목표

사용자별 상태를 전역이 아닌 세션/지역변수에 보관합니다.

⚠️ 현재 취약점

Wrong-Session Data Exposure

전역 상태로 동시 사용자 정보가 교차 노출됩니다.

📰 실제 사고사례 & 표준 매핑
세션 간 데이터가 격리되지 않아 한 사용자의 정보가 다른 사용자에게 노출된 사례가 있습니다.
🏷️ CWE-488
※ 공개적으로 알려진 사례 기반 교육용 요약 · CWE/OWASP는 공개 표준 분류