gnuboard / g6

파이썬 게시판 그누보드6 : GNUBOARD6 is Python CMS with fastapi
https://sir.kr
MIT License
245 stars 80 forks source link

Open Redirect 취약점 제보합니다. #557

Open arrester opened 2 months ago

arrester commented 2 months ago

Security 탭에서 제보가 불가능하여 Issues를 통해 제보드립니다.

Version: 6.0.3

Vuln: Open Redirect

PoC

http://localhost:8000/bbs/login?url=https://google.com

Impact

Secure Code (bbs/login.py)

https://github.com/gnuboard/g6/blob/master/bbs/login.py

아래 코드에서 url 인자에 대해 필터링이 미흡하여 발생하기 때문에 필터링 추가 필요

@router.post("/login")
async def login(
        request: Request,
        member_service: Annotated[MemberService, Depends()],
        mb_id: str = Form(...),
        mb_password: str = Form(...),
        auto_login: bool = Form(default=False),
        url: str = Form(default="/")
):
    """로그인 폼화면에서 로그인"""
    member = member_service.authenticate_member(mb_id, mb_password)

    request.session["ss_mb_id"] = member.mb_id
    # XSS 공격에 대응하기 위하여 회원의 고유키를 생성해 놓는다.
    ss_mb_key = session_member_key(request, member)
    request.session["ss_mb_key"] = ss_mb_key

    # 자동로그인
    response = RedirectResponse(url=url, status_code=302)
    # 최고관리자는 보안상 자동로그인 기능을 사용하지 않는다.
    if auto_login and not is_super_admin(request):
        age_1day = 60 * 60 * 24
        cookie_domain = request.state.cookie_domain
        response.set_cookie(key="ck_mb_id", value=member.mb_id,
                            max_age=age_1day * 30, domain=cookie_domain)
        response.set_cookie(key="ck_auto", value=ss_mb_key,
                            max_age=age_1day * 30, domain=cookie_domain)

    return response
arrester commented 2 months ago

패치하신 내용을 검토한 결과 우회가 가능하여 아래 내용을 전달드립니다. url 파라미터 인자에서 // 에 대한 검증이 없어 별도로 추가한 allow_urls에 개발자가 원하는 도메인을 넣고 관리하더라도 슬래시 2개를 통해 원하는 도메인으로 변경하여 접근하도록 수정할 수 있습니다.

PoC https://g6.demo.sir.kr/bbs/login?url=//google.com

추가로 해당 취약점 건에 대해 CVE 등록 해주실 수 있으신지 문의드립니다.

Letm3through commented 2 months ago

안녕하세요 @arrester @KimTom89 님, 해당 우회 관련 취약점 경우 패치 및 버전 업이 1주일 경과한 시점에서 제가 제보하였습니다.

제가 제보후 똑같은 내용으로 @arrester 님께서 댓글을 달았기에 관련 취약점 경우 CVE 등록시 제 명의로 등록되는게 맞습니다. @KimTom89 님, CVE 등록 경우 그누보드측에서 진행해주시는지 알수있을까요?

KimTom89 commented 2 months ago

@arrester @Letm3through 안녕하세요. 저희 측에서는 따로 CVE를 등록하고 있지 않으며, 취약점 관련 조치 안내(CVE, KVE 등)가 오게되면 이에 대한 대응만 진행하고 있습니다.

Letm3through commented 2 months ago

@KimTom89 알겠습니다. 확인 감사드립니다. 관련 이슈에 조치 PR 또한 제보시 올렸으니 참고하여 진행부탁드립니다. 감사합니다.

arrester commented 2 months ago

안녕하세요 @Letm3through 님 순서대로 본다면 저 그리고 Letm3through님 둘 다 CVE 등록이 되는게 맞습니다. 저는 우회되는 점에 대해 등록 문의를 한 것이 아닌 6.0.3 버전에서 발생한 취약점에 대해 등록 문의를 한 것입니다. 지금까지 발생된 이력을 요약하면 아래와 같습니다.

  1. 6.0.3 Version 기준 Open Redirect 취약점 제보함 - arrester (이 시점에 CVE 등록)
  2. 패치를 늦게 확인하여 6.0.3에서 발생했던 취약점에 대해 패치가 정상적으로 되었는지 확인을 한 내용을 전달함 이 부분은 해당 취약점을 제보한 입장에서 패치가 정상적으로 되었는지 이행 점검을 하는 부분이라 당연한 부분임 (Letm3through님이 제보한 것과 별개로 진행된 부분)
  3. 이행점검이 진행되기 전 패치 후 버전 업데이트가 완료됨 이후 Letm3through님이 우회되는 부분을 발견 (버전 업데이트 이후기 때문에 이 부분도 CVE 등록)
  4. 따라서 시점에 따라 CVE가 2번 나와야 함 (arrester, Letm3through)

이상입니다.

arrester commented 2 months ago

@KimTom89 알겠습니다. 답변 감사합니다.