Skip to content

크롤 쉼은 공개 인터넷 주소만 읽는다 - #28

Closed
nam-jaehyun wants to merge 1 commit into
mainfrom
fix/fetch-ssrf
Closed

nam-jaehyun wants to merge 1 commit into
mainfrom
fix/fetch-ssrf

Conversation

@nam-jaehyun

Copy link
Copy Markdown
Member

변경

  • services/crawl4ai-shim/netguard.py: 스킴은 http(s)만, 호스트를 IP로 풀어 하나라도 공개 주소가 아니면 거절한다(루프백·사설·링크로컬·CGNAT·IPv4-mapped IPv6·메타데이터 이름·.local/.internal·점 없는 서비스 이름). URL에 자격 증명이 들어 있어도 거절.
  • app.py: 브라우저를 열기 전에 검사하고, 리다이렉트를 따라간 뒤 도착한 주소(redirected_url)도 같은 기준으로 다시 본다. 거절은 {"success": false, "error": …}로 돌아간다.
  • Dockerfile에 netguard.py 복사, CI pytest 대상에 services/crawl4ai-shim/tests 추가.

확인

  • 시험 22건 통과, ruff check scheduler services 통과.
  • KloudChat API 쪽에도 같은 검사를 넣은 PR이 따로 있다(요청 전에 걸러 모델과 사용자에게 이유를 돌려준다). 남는 것은 DNS 리바인딩(검사 시점과 브라우저의 해석 시점이 다름)으로, 이 쉼을 사설 네트워크 밖으로 내보내지 않는 한 실익이 작다.

/tools/fetch 는 인증 없이 닿고 쉼은 LiteLLM·데이터베이스·다른 도구 서비스와
같은 사설 네트워크에 있어, 넘겨받은 URL 로 내부 서비스를 더듬을 수 있었다
(SSRF). file:// 같은 스킴도 그대로 브라우저에 넘어갔다.

- netguard.refusal: http(s) 만 허용하고, 호스트를 IP 로 풀어 하나라도
  공개 주소가 아니면(루프백·사설·링크로컬·CGNAT·메타데이터 이름·점 없는
  서비스 이름·.local/.internal) 거절한다.
- 브라우저가 리다이렉트를 따라간 뒤 도착한 주소도 같은 기준으로 다시 본다.
- 시험 22건, CI 의 pytest 대상에 추가.
@nam-jaehyun

Copy link
Copy Markdown
Member Author

이 변경은 #29 에 딸려 들어가 main 에 이미 있습니다(#29 브랜치를 이 브랜치 위에서 만들었던 탓). main 의 netguard.py·app.py·tests 가 이 PR 의 head 와 같아 닫습니다.

@nam-jaehyun nam-jaehyun closed this Sep 7, 2026
@nam-jaehyun
nam-jaehyun deleted the fix/fetch-ssrf branch September 7, 2026 23:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant