<p>์š”์ฒญ[๋ณด์•ˆ] / PyOpenSSL์€ ์š”์ฒญ์„ ๋” ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š์ง€๋งŒ ๋” ์ทจ์•ฝํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.</p>

์— ๋งŒ๋“  2019๋…„ 11์›” 18์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: psf/requests

์š”์ฒญ์€ 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์˜ ๋ฌด์กฐ๊ฑด ์›์ˆญ์ด ํŒจ์น˜๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

#5443 ๋ณ‘ํ•ฉ ํ›„ ๋‹ซํžˆ์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์— ์œ ์ผํ•œ ๋›ฐ์–ด๋‚œ ํ•ญ๋ชฉ์€ requests[security] ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” <Python 2.7.9.0์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์ง€๊ธˆ์€ ๋‚จ๊ฒจ๋‘๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ฃผ์— urllib3์™€ ํ•จ๊ป˜ ์ƒˆ๋กœ์šด ๋ถ€ ๋ฒ„์ „์„ ์ถœ์‹œํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋‹ค์Œ ๋ถ€ ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์‚ฌ์šฉ ์ค‘๋‹จ ์•Œ๋ฆผ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ํ”ผ๋“œ๋ฐฑ์ด ์—†์œผ๋ฉด ๋‚ด์ผ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ดˆ๊ธฐ ์š”์ฒญ์ด ํ•ด๊ฒฐ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  3 ๋Œ“๊ธ€

์š”์ฒญ ๋ฐ 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์™€ ํ•จ๊ป˜ ์ƒˆ๋กœ์šด ๋ถ€ ๋ฒ„์ „์„ ์ถœ์‹œํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋‹ค์Œ ๋ถ€ ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์‚ฌ์šฉ ์ค‘๋‹จ ์•Œ๋ฆผ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ํ”ผ๋“œ๋ฐฑ์ด ์—†์œผ๋ฉด ๋‚ด์ผ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ดˆ๊ธฐ ์š”์ฒญ์ด ํ•ด๊ฒฐ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰