gnuboard / gnuboard5

그누보드5 (영카트 포함) 공개형 Git
Other
299 stars 244 forks source link

IP 변경으로 인한 관리페이지 접근 시 접속이 제한되는 문제 해결 #284

Closed kkigomi closed 9 months ago

kkigomi commented 10 months ago

이 변경사항은 관리자 계정이 프록시, 무선 접속 환경(와이파이, 셀룰러)에서 IP가 수시로 변경될 수 있는 환경에서 관리페이지 접근 시 수시로 제한이 적용되는 문제를 해결하기 위함입니다.

문제점

관리자 계정이 관리페이지에 접근할 때 ss_mb_key 세션으로 검증과정을 거치는데 ss_mb_key 세션의 값에 IP가 조합되어 사용되므로 IP가 변경되는 환경이라면 관리페이지 접근에 수시로 제한이 적용됩니다.

또한, IP를 가져올 때 사용하는 get_real_client_ip() 함수에서 참조하는 $_SERVER['HTTP_X_FORWARDED_FOR']는 헤더를 이용해 쉽게 위조가 가능하므로 관리자의 IP가 노출된다면 방어수단으로 사용하기에 적합하지도 않습니다.

해결방안

ss_mb_key 세션의 문자열을 생성할 때 IP를 제거하여 문제를 해결할 수 있습니다.

ss_mb_key 값은 회원의 가입일시 + IP + 브라우저 UA 문자열이 조합되어 만들어 집니다. 사실상 회원의 가입일시만으로도 위조가 불가능한 hash를 생성할 수 있으나, 접속 세션의 클라이언트 검증이라는 목적을 유지한다면 가입일시와 UA를 유지하고 IP는 제외할 수 있습니다.

이는 본인이 제보했던 #257 이슈에서 세션 고정취약점 해결 및 HttpOnly로 세션 쿠키가 생성되므로 탈취 가능성을 제거했고 또한, #208 이슈에서도 일반 쿠키의 탈취 가능성도 제거했으므로 IP 등을 제거하기에 문제가 없습니다.

다만, #257 이슈에서 세션고정 취약점을 해결할 때 SKIP_SESSION_REGENERATE_ID 상수로 세션고정 취약점이 재현될 수 있는 환경이 있을 수 있으므로 클라이언트 검증은 유지하는 것이 나을 것으로 보입니다.

해결방안의 적용

위와 같은 문제를 해결하기 위해 IP를 대신하여 클라이언트를 검증할 쿠키를 생성하여 이를 조합에 사용하는 방법으로 문제를 해결하도록 했습니다.

랜덤으로 생성한 문자열을 mb_client_key 쿠키를 사용하고 generate_mb_key(), verify_mb_key() 함수를 이용해 ss_mb_key 세션의 Hash 문자열을 생성하고 검증하도록 했습니다.

IP를 제거하여 이 PR의 주요 문제를 해결하고 클라이언트 검증 기능을 유지하도록 했습니다.

// 로그인 세션 생성 시
// bbs/login_check.php
generate_mb_key($mb);

// 검증
// bbs/admin.lib.php
if (!verify_mb_key($member)) {
    session_destroy();
    // ...
}
kkigomi commented 10 months ago

@maycactus-FOSS 쿠키의 유효 시간을 브라우저 세션 유지 동안으로 변경했습니다.

만료시간 때문에 G5_SERVER_TIME * -1 이런 꼼수를 사용하긴 했지만, set_cookie() 함수를 그대로 사용하는 것이 좋을 것 같아서 기능을 따로 분리하지 않고는 마땅한 방법이 떠오르진 않네요.

관리 계정의 로그인 상태가 유지되는 중에 갑작스런 세션 만료가 발생하지 않도록 지연 시켰던 것입니다.

thisgun commented 9 months ago

안녕하세요. SIR 입니다.

코드를 제공해 주셔서 정말 감사합니다. ^_^