Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PythonのURLパーサで見つかった脆弱性について解説する

 PythonのURLパーサで見つかった脆弱性について解説する

34回 初心者のためのセキュリティ勉強会(オンライン開催)の発表資料です。
https://sfb.connpass.com/event/292127/

kuzushiki

August 28, 2023
Tweet

More Decks by kuzushiki

Other Decks in Technology

Transcript

  1. 34回 初心者のためのセキュリティ勉強会 発表内容 Pythonの標準ライブラリ urllib.parse に脆弱性が見つかった Pythonはよく使っており、興味があったので解説する ` ` The

    Hacker News @TheHack… · Follow Critical Python URL parsing flaw (CVE-2023-24329) discovered! Allows domain filter bypass, enabling file reads & command execution. Find details here: thehackernews.com/2023/08/new- py… #cybersecurity #hacking #programming #DevOps 3 / 11
  2. 34回 初心者のためのセキュリティ勉強会 脆弱性の挙動を確認してみた 先頭にスペースを入れた場合、適切にパースできていない! 1 root@dfa36d67dd55:~# python3 2 Python 3.11.3

    (main, May 23 2023, 13:34:03) [GCC 10.2.1 20210110] on linux 3 Type "help", "copyright", "credits" or "license" for more information. 4 >>> from urllib.parse import urlparse 5 6 >>> urlparse("http://example.com") 7 ParseResult(scheme='http', netloc='example.com', path='', params='', query='', fragment='') 8 9 >>> urlparse(" http://example.com") 10 ParseResult(scheme='', netloc='', path=' http://example.com', params='', query='', fragment= 5 / 11
  3. 34回 初心者のためのセキュリティ勉強会 どう修正されたか 修正コミットを見てみよう! gh-102153: Start stripping C0 control and

    space chars in urlsplit (… · python/cpython@2f630e1 -> WHATWGの仕様に沿って、先頭と末尾のC0制御文字およびスペースを削除するようにした ` ` ” Leading and trailing C0 control and space to be stripped per WHATWG spec. ” A C0 control is a code point in the range U+0000 NULL to U+001F INFORMATION SEPARATOR ONE, inclusive. https://infra.spec.whatwg.org/#c0-control 6 / 11
  4. 34回 初心者のためのセキュリティ勉強会 悪用されるケース Q. でも、URLの検証不備ってそこまで大した影響ないんじゃ… A. ブラックリスト形式でスキームやホストを制限しているとSSRFなどの恐れあり 1 from urllib.parse

    import urlparse 2 3 def safe_url_opener(input_link): 4 block_schemes = ["file", "gopher"] 5 block_host = ["localhost", "instagram.com", "youtube.com", "tiktok.com"] 6 7 if urlparse(input_link).scheme in block_schemes: 8 return 'Blocked! Input scheme is forbidden.' 9 10 if urlparse(input_link).hostname in block_host: 11 return 'Blocked! Input hostname is forbidden.' 12 13 # このあと検証後のURLに対してリクエストを送信したりする 7 / 11
  5. 34回 初心者のためのセキュリティ勉強会 余談 ドキュメントに以下の記述が追加されていた -> 開発者は脆弱性というより仕様に近いと考えているようだ 今回は開発者が修正してくれたが、本来こういったライブラリはセキュリティ用途ではない -> ライブラリを使う側にも責務はあることは忘れないでおきたい ”

    urlsplit() と urlparse() API は入力の検証を行いません。他のアプリケーションが無効とみなす入力に対してエラ ーを発生させることはありません。また、他のアプリケーションではURLとみなされないような入力でも成功すること があります。これらのAPIの目的は、純粋さよりも実用的な機能性です。 https://docs.python.org/ja/3/library/urllib.parse.html#url-parsing-security を和訳 10 / 11