← Adelie

Windows 호환성 — 이 고생을 왜 했나

WinError 87, 쉘 인젝션, 경로 순회, 크로스플랫폼 테스트 지옥

Windows보안크로스플랫폼

macOS에서 잘 돌아가던 게 Windows에서 온갖 곳에서 터졌다. 이틀 동안 Windows 호환성만 잡았다.

WinError 87

os.kill(pid, 0)가 Windows에서 안 된다. 리눅스/맥에서는 프로세스 존재 여부 체크하는 관용적인 방법인데, Windows는 이 시그널 자체를 지원 안 함. Monitor AI랑 Runner AI에서 프로세스 상태 확인할 때 쓰고 있었는데, 전부 ctypes.windll.kernel32.OpenProcess로 바꿔야 했다.

보안 구멍들

크로스플랫폼 작업하면서 보안 점검도 같이 했는데, 생각보다 구멍이 많았다.

BLOCKED_CHARS에서 &&만 막고 있었는데, Windows cmd.exe는 & 하나로도 명령어 체이닝이 된다. > 리다이렉션도 마찬가지. 전부 단일 문자로 막도록 바꿨다.

경로 순회 방지도 문제였다. 기존엔 /로 시작하는지만 체크했는데, Windows의 C:\... 같은 절대경로는 통과해버리는 거였다. Path.resolve()로 실제 해석된 경로가 staging 루트 안에 있는지 확인하는 방식으로 바꿨다.

python3 스텁

이건 좀 웃긴 건데, Windows에서 shutil.which("python3") 하면 Microsoft Store의 가짜 stub이 잡힌다. WindowsApps/python3.EXE라는 놈인데, 실행하면 Store 페이지만 열림. sys.executable로 현재 실행 중인 Python을 직접 쓰도록 바꿨다.

venv 활성화

source bin/activate가 당연히 Windows에서 안 된다. activate.bat &&로 바꿔야 하고, 서브프로세스도 cmd /c로 감싸야 했다. env_strategy.py 전체를 OS별 분기 처리했는데, 코드가 좀 지저분해진 건 아쉽다.

그래도 이 작업 끝나고 나서 크로스플랫폼 테스트 6개가 전부 통과했을 때는 좀 시원했다.

Adelie의 다른 기록 보기
김현빈 Developer & Writer

기술, 포스팅 관련 질문, 프로젝트 협업 등 연락주시면 언제든지 회신 드립니다.

esc

↑↓ 고르기↵ 열기? 단축키

해변에서 주운 것

읽으러 가기 →
guest@beachcombers — zsh

단축키

⌘K 또는 /
글·작업·개발일지 찾기
R
해변 산책 — 아무 글 하나 줍기
`
터미널 열기
←→
쪽 넘기기 (휠·스와이프도 됩니다)
?
이 안내
esc
닫기