Featured image of post PyScript와 Security 🐍🗡

PyScript와 Security 🐍🗡

최근 PyCon US 2022의 발표 중 PyScript가 공개되었습니다. PyScript는 HTML에서 Python 코드를 사용할 수 있도록 제공하는 라이브러리로 최근 엄청난 범용성과 낮은 러닝 커브를 가진 Python이 웹으로 확장하는 부분이라 관심도 많고 말도 많습니다.

HMLT 내부에서 코드를 쓰는 방식이 PHP와 뭐라 다르냐란 이야기도 있습니다. 오히려 시대를 역행한다는 이야기도 봤던 것 같네요.

디자인 패턴이나 코드에 대한 내용은 개발자분들이 많이 신경쓰실 내용이고, 우리는 보안 엔지니어링이니 보안쪽 관점에서도 한번 살펴봐야해서 요 며칠 가볍게 고민해보고 글로 작성해봅니다.

PyScript

PHP에서 <?php ?> 문법으로 PHP 구문을 사용하던 것과 비슷합니다. <py-script> 태그를 작성한 부분은 python 문법으로 동작하게 됩니다.

1
2
3
<html>
    <py-script> print('Hiiii') </py-script>|
</html>

실제 js 라이브러리까지 포함한 내용은 아래와 같겠네요.

1
2
3
4
5
6
7
8
9
<html>
    <head>
        <link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css" />
        <script defer src="https://pyscript.net/alpha/pyscript.js"></script>
    </head>
    <body>
      <py-script> print('Hello, World!')</py-script> 
    </body>
</html>

How to work

PyScript는 Pyodide을 기반으로 개발되었습니다. 이는 웹어셈블리(WASM)를 기반으로 브라우저와 Node.js를 위한 파이썬 배포판입니다.

참고로 WASM은 제가 예전에 “웹 어셈블리(Web Assembly)는 어떻게 보안 취약점 분석을 할까요?“란 글을 작성했었습니다. 여기서 WASM이 뭔지, 어떻게 보안 테스팅을 할 수 있는지 보실 수 있습니다.

자세한 동작을 본건 아니지만 어쨌던 PyScript는 WASM 기반으로 Python(cPython)을 동작하여 실행한다는 것을 알 수 있습니다.

Elements

Script

<py-script>는 웹 페이지 내에서 실행 가능한 파이썬 코드를 정의하는 데 사용합니다. 해당 Element는 페이지에 렌더링되지 않고 마치 <script> 태그와 같이 로직만 동작합니다. src 속성도 비슷하게 사용할 수 있습니다.

1
<py-script src="/app.py"></py-script>

Repl

페이지에 코드 편집기로 렌더링되고 사용자가 실행할 수 있는 코드를 작성할 수 있는 REPL을 만듭니다.

Examples

Security

제가 위에서 PyScript가 WASM 기반으로 동작한다고 했습니다. 결국 단순히 문법만 매핑시킨게 아니라 실제로 Python이 구동될 수 있기 때문에 사용자에게 페이지에 대한 제어권을 주거나 XSS 등의 이슈가 있는 경우 좀 더 리스크가 증가하게 됩니다.

Sensitive data exposure

Python 코드가 FE단에서 사용된다면 시큐어 코딩에서도 관점이 약간 변하게 됩니다. 보통 Secret이나 Key 등의 정보는 백엔드에서 처리하도록 하지만, FE에서 쉽게 Python 모듈을 사용할 수 있는 경우 분명히 일부 개발자는 중요한 정보를 PyScript 단에서 사용할 수도 있습니다.

만약 이렇게 사용되는 경우 쉽게 중요정보를 탈취할 수 있어서 연쇄적인 공격으로 이어질 수 있습니다.

Leak without browser policy

코드 동작이 WASM 내부에서 별도로의 바이너리로 발생하기 때문에 기존 Browser에서의 보안 정책과 통제 로직을 적용받지 못하는 경우가 발생합니다. 그래서 공격자가 데이터를 빼돌리는데 있어서 CSP 등으로 제한을 받더라도, PyScirpt 코드를 통해서 우회하여 데이터를 유출할 수 있는 경우가 있을 것 같습니다.

DOS

Javascript 처럼 브라우저에 내장되어 밀접하게 동작하는 것이 아닌 WASM으로 처리하기 때문에 구성에 따라 오버헤드가 클 수 있습니다. 결국 이를 잘 이용하면 간단한 코드로도 충분히 단일 또는 광범위한 사용자를 대상으로 DOS를 일으키기 충분하단 것을 알 수 있습니다.

XSS

PyScript를 통해서 XSS 우회 패턴을 충분히 만들 수 있습니다. 만약 Deny-list 기반의 검증 로직이라면 당연히 <py-script> 등은 패턴에 빠져있을 확률이 높아서 태그 기반으로도 충분히 우회할 수 있고, 만약 주요 공격 구문 등으로 Escape 처리한다고 해도 Python 코드를 통해 쉽게 난독화하여 XSS 대응 로직을 무력화 시킬 수도 있습니다.

Bypassing Sandbox

기본적으로 os 등 여러 모듈을 로드할 수 있기 때문에 Command Execute의 가능성 또한 존재합니다. 다만 Pyodide이 이러한 보안 문제는 Sandboxing 등의 기술로 통제하는 것 같습니다.

그래도 Pyodide에서 이러한 보안 로직에 대한 우회가 발생하는 경우 단순히 해당 모듈만의 문제가 아닌 PyScript에선 광범위한 사용자를 대상으로 Command Execution 등이 발생할 수 있어서 문제가될 것 같습니다. 혹시나 PyScript를 사용하게 된다면 이점을 고려하고 보안 이슈에 대해서 민감하게 체크하고 있어야할 것 같네요.

Etc

이외에도 WASM에 대한 보안 이슈부터 로직적인 부분, 파이썬 코드상의 문제등으로 여러가지 이슈가 나타날 수 있을 것 같습니다 😭

References