본문 바로가기
INFORMATION SECURITY · FREE LEARNING정보보안 학습센터원리 → MASTER → 문제·복습 → MUST KNOW

번호를 안다고 그 자료의 주인이 되지는 않는다

정보보안의 원리 · 방향 6

© K-BOOKS · 무료 웹 열람용 콘텐츠입니다. 무단 복제·저장·인쇄·재배포를 제한합니다.

여섯 번째 발걸음번호를 안다고 그 자료의 주인이 되지는 않는다

당신의 예약 번호는 51입니다. 주소창에 보이는 번호를 52로 바꾸었더니 다른 사람의 예약이 나타납니다. 문법 오류도 없고 데이터베이스의 오류 메시지도 나오지 않습니다. 요청 형식은 정상인데 허용할 범위가 잘못되었습니다. 이런 문제는 객체별 인가가 빠졌거나 잘못된 곳에서 판단되었을 때 생길 수 있습니다.

서버는 요청자가 누구인지 확인한 뒤, 그 요청자가 바로 그 객체에 바로 그 행동을 해도 되는지 판단해야 합니다. 예약 51을 읽을 수 있다는 권한이 예약 52를 읽을 권한으로 확장되지는 않습니다. 읽을 수 있다고 취소하거나 다른 이용자에게 넘겨도 되는 것도 아닙니다. OWASP API Security Top 10:2023의 BOLA는 이런 객체 수준의 인가 실패를 다룹니다.

수평 권한 상승은 비슷한 역할의 다른 이용자가 가진 자료나 기능에 접근하는 경우를, 수직 권한 상승은 더 높은 역할의 권한을 얻는 경우를 설명할 때 사용합니다. 사용자 A가 B의 예약을 보는 문제와 일반 사용자가 관리자용 전체 내보내기를 실행하는 문제는 확인할 정책이 다릅니다. 역할 이름만 검사하거나 화면에서 버튼을 숨기는 것으로 모든 인가를 대신할 수 없습니다.

객체 안의 속성별로도 권한이 달라질 수 있습니다. 이용자는 배송 주소를 바꿀 수 있지만 결제 완료 상태나 적립금 잔액을 직접 지정하면 안 됩니다. 요청의 여러 필드를 서버 객체에 자동으로 대입하는 대량 할당 기능을 제한 없이 사용하면, 허용하지 않은 속성까지 바뀔 수 있습니다. 반대로 응답 객체를 통째로 보내고 화면에서만 비밀 필드를 숨기면, 네트워크 응답에는 이미 정보가 나갔을 수 있습니다. 필요한 입력 필드와 반환 필드를 명시합니다.

번호를 긴 무작위 값이나 UUID로 바꾸면 추측은 어려워질 수 있습니다. 하지만 주소가 공유되거나 기록에서 노출되었을 때에도 권한 검사가 유지되어야 합니다. 식별자를 아는 것과 접근 자격은 별개입니다. 부서·기관별로 데이터를 나누는 서비스에서는 사용자 번호뿐 아니라 조직 경계도 서버가 확인한 신원과 연결해야 합니다.

# current_user_id는 검증된 서버 세션에서 얻은 값입니다.
sql = """
SELECT id, room, starts_at
FROM reservations
WHERE id = ? AND owner_id = ?
"""
row = db.execute(sql, (reservation_id, current_user_id)).fetchone()

가상의 SQLite 조회 코드 조각. 객체 번호의 형식 검증과 세션 검증이 앞에서 완료되었다고 가정합니다.

함께 따라가기 · 조회 범위에 신원을 연결한다

위 코드는 요청의 예약 번호와 현재 신원을 같은 질의 조건에 연결합니다.

  1. reservation_id는 이용자가 선택한 대상입니다. current_user_id는 요청 본문에서 복사하지 않고 검증된 서버 세션에서 얻습니다. 공격자가 owner_id를 바꾸어 보내도 자신의 신원을 임의로 정할 수 없게 하기 위해서입니다.

  2. 두 값은 모두 매개변수로 전달됩니다. SQL 인젝션을 막는 처리와 객체의 소유자 조건은 각각 다른 경계를 담당합니다. 둘 중 하나만 있다고 다른 하나가 자동으로 생기지는 않습니다.

  3. 공동 예약, 관리자 승인, 조직 간 위임처럼 정책이 복잡해지면 owner_id 조건 하나만으로 충분하지 않습니다. 그 정책을 한곳에서 일관되게 판단하고 기능별로 호출하며, 변경된 정책이 기존 기능에도 적용되는지 확인해야 합니다.

깨달음권한은 화면이 아니라 서버의 자원 사용 지점에서 적용합니다. 구현 예제가 단순할수록 그 예제가 생략한 업무 조건도 분명하게 읽어야 합니다.

검증에서는 두 개 이상의 가상 계정과 서로 다른 역할을 사용해 같은 객체를 요청해 봅니다. 자기 자료에는 정상 접근이 가능하고, 다른 사람 자료와 관리자 기능에는 정책대로 제한이 걸려야 합니다. 성공한 한 계정의 흐름만 따라가면 권한이 너무 넓은 구현도 정상처럼 보일 수 있습니다.

권한 검사 자체에 오류가 생겼을 때의 동작도 정합니다. 정책 조회가 실패했다는 이유로 일단 허용하면 장애가 곧 접근 우회가 될 수 있습니다. 보호 목표에 맞게 거부하고, 정상 업무를 위한 예외 절차는 별도로 승인·기록해야 합니다. “실패하면 허용”이라는 암묵적 코드 경로를 남기지 않는 것이 중요합니다.

참고 [215] · [228] · [229] · [230]

이 브라우저에 학습 기록을 저장합니다.

CONTINUE LEARNING

지금 공부한 흐름을 책으로 이어가세요

무료 학습은 그대로, 종이책은 필요한 분을 위한 선택지입니다.

정보보안 MUST KNOW전체 도서 12권