์์ฒญ์ Python์ stdlib์ ์๋ ssl ๋ชจ๋์ ์ผ๋ถ ๊ธฐ๋ฅ์ด ์์๊ธฐ ๋๋ฌธ์ ๋ช ๋
์ ์ requests[security]
์ข
์์ฑ์ ์ถ๊ฐํ์ต๋๋ค. PEP 466์ด Python 2.7.9์์ ๊ตฌํ๋์์ผ๋ฏ๋ก ssl ๋ชจ๋์ ํธ์คํธ ์ด๋ฆ ํ์ธ ๋ฐ SNI๋ฅผ ์ง์ํฉ๋๋ค. 2.7.9๋ 2014๋
์ ๋ฆด๋ฆฌ์ค๋์์ต๋๋ค. Python 3.7.0์ ํธ์คํธ ์ด๋ฆ ํ์ธ์ OpenSSL์ ์์ํ์ฌ ์ํฉ์ ๋์ฑ ๊ฐ์ ํ์ต๋๋ค. urllib3์ PyOpenSSL ํธํ์ฑ ๊ณ์ธต์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ssl.match_hostname
ํจ์ ๋๋ ๋ฐฑํฌํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
urllib3.contrib.pyopenssl.inject_into_urllib3
๋ฅผ ์ฌ์ฉํ urllib3์ ๋ฌด์กฐ๊ฑด์ ์ธ ์์ญ์ด ํจ์น๋ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๊ณ ์์ต๋๋ค.
PyOpenSSL์ ๋์ libffi ์ฝ๋ฐฑ(cffi ๊ตฌ์ ์ฝ๋ฐฑ์ด๋ผ๊ณ ๋ ํจ)์ ์ฌ์ฉํฉ๋๋ค. ์ฝ๋ฐฑ์ ํธ๋จํ๋ฆฐ๊ณผ ๋ค์ดํฐ๋ธ ๊ธฐ๊ณ ์ฝ๋์ ๋์ ์์ฑ์ผ๋ก ๊ตฌํ๋ฉ๋๋ค. ์ด๊ฒ์ ์คํ ๊ฐ๋ฅํ๊ณ ์ฐ๊ธฐ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง ๋๋ ๊ณต์ mmap() ์์ญ์ด ์๋ ์ผ๋ถ ํดํน์ ์ฌ์ฉํฉ๋๋ค. ๋์ ์ฝ๋ฐฑ์ ๋ณด์ ์ํ์ด๋ฉฐ SELinux์ ๊ฐ์ ๋ณด์ ํ๋ ์์ํฌ์ ์ํด ์ฐจ๋จ๋ฉ๋๋ค(deny_execmem). Armin Rigo์ ์ ๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ํ ๋ฐฉ๋ฒ์ ๋ชจ์ํ์ง๋ง ๋จ์ํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๋ค. ๊ฒฐ๊ตญ Armin์ cffi๋ฅผ ์ํ ์๋ก์ด ์ฝ๋ฐฑ ์์คํ ์ ๊ตฌํํ์ต๋๋ค. ์ด์ ์ฝ๋ฐฑ๊ณผ ๊ด๋ จ๋ ์ผ๋ถ ๋ฌธ์ ๋ https://cffi.readthedocs.io/en/latest/using.html#callbacks -old-style ์ ์ค๋ช ๋์ด ์์ต๋๋ค.
PyOpenSSL์ ํ์ฌ ์์ฒด์ ์ผ๋ก asn1crypto์ ์์กดํ๋ ์ํธํ ๋ฒ์ ์ ๊ฐ์ ธ์ต๋๋ค. asn1crypto ๋ฐ ctypes์ ๋ฌธ์ ๋ก ์ธํด Python์ ์ต๊ทผ macOS, https://github.com/pyca/pyopenssl/issues/874 ๋ฐ https://github.com/wbond/asn1crypto/issues/158 ์์ segfault๋ฅผ ๋ฐ์์ํต๋๋ค.
https://bugzilla.redhat.com/show_bug.cgi?id=1535689 ์ ๊ฐ์ ๋ฒ๊ทธ๋ก ์ธํด ์ ๋ Fedora ๋ฐ RHEL ์ ์ง ๊ด๋ฆฌ์์๊ฒ ์์ฒญ์ ํจ์นํ๊ณ ์ผ๋ง ์ ์ inject_into_urllib3
์ญ์ ํ๋๋ก ์ค๋ํ์ต๋๋ค. ๋ฐฐํฌํ์ ๋ณด๊ณ ๋ ๋ฌธ์ ์์ด 1๋
๋๊ฒ https://src.fedoraproject.org/rpms/python-requests/blob/master/f/Don-t-inject-pyopenssl-into-urllib3.patch ํจ์น๋ก ์คํ๋์์ต๋๋ค. .
๋๋ ๋ค์์ ์ ์ํฉ๋๋ค:
1) requests[security]
์ถ๊ฐ ์๊ตฌ ์ฌํญ์ ์ ๊ฑฐํฉ๋๋ค.
2) ์์ฒญ์์ urllib3์ ๋ฌด์กฐ๊ฑด ์์ญ์ด ํจ์น๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
์์ฒญ ๋ฐ urllib3์ ๋ํ ์ด ๋ฐฉํฅ์ ์ง์ํ๋ ๋ฐ์ดํฐ ํฌ์ธํธ: urllib3์ ๋ํ Python 2.7.X ๋ค์ด๋ก๋์ 91%(7,298,352 / 7,993,356)๊ฐ Python 2.7.9+์ ์์์ต๋๋ค. ์ค๋์ ๊ณต๊ฐ ๋ค์ด๋ก๋ ๋ฐ์ดํฐ ์ธํธ์์ ๊ฐ์ ธ์์ต๋๋ค.
๋น์จ์ ๋์ฑ ํฝ๋๋ค. RHEL 7 ์์คํ ์ Python 2.7.5์๋ PEP 466์ ๋ฐฑํฌํธ๊ฐ ์์ต๋๋ค.
$ rpm -qa python
python-2.7.5-88.el7.x86_64
$ python
Python 2.7.5 (default, Sep 26 2019, 13:23:47)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
>>> ssl.SSLContext(ssl.PROTOCOL_SSLv23).check_hostname
False
#5443 ๋ณํฉ ํ ๋ซํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ด ์๊ฐ์ ์ ์ผํ ๋ฐ์ด๋ ํญ๋ชฉ์ requests[security]
์
๋๋ค. ๋๋ <Python 2.7.9.0์ ์ฌ์ฉํ๋ ์ฌ๋์ ์ํด ์ง๊ธ์ ๋จ๊ฒจ๋๊ณ ์ถ์ต๋๋ค. ์ด๋ฒ ์ฃผ์ urllib3์ ํจ๊ป ์๋ก์ด ๋ถ ๋ฒ์ ์ ์ถ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๋ค์ ๋ถ ๋ฆด๋ฆฌ์ค์ ๋ํ ์ถ๊ฐ ์ฌ์ฉ ์ค๋จ ์๋ฆผ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๋ ๋ง์ ํผ๋๋ฐฑ์ด ์์ผ๋ฉด ๋ด์ผ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ฒ ์ต๋๋ค. ์ด์ ์ด๊ธฐ ์์ฒญ์ด ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
#5443 ๋ณํฉ ํ ๋ซํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ด ์๊ฐ์ ์ ์ผํ ๋ฐ์ด๋ ํญ๋ชฉ์
requests[security]
์ ๋๋ค. ๋๋ <Python 2.7.9.0์ ์ฌ์ฉํ๋ ์ฌ๋์ ์ํด ์ง๊ธ์ ๋จ๊ฒจ๋๊ณ ์ถ์ต๋๋ค. ์ด๋ฒ ์ฃผ์ urllib3์ ํจ๊ป ์๋ก์ด ๋ถ ๋ฒ์ ์ ์ถ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๋ค์ ๋ถ ๋ฆด๋ฆฌ์ค์ ๋ํ ์ถ๊ฐ ์ฌ์ฉ ์ค๋จ ์๋ฆผ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.๋ ๋ง์ ํผ๋๋ฐฑ์ด ์์ผ๋ฉด ๋ด์ผ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ฒ ์ต๋๋ค. ์ด์ ์ด๊ธฐ ์์ฒญ์ด ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ต๋๋ค.