경쟁 조건 취약점이란 무엇입니까?

경쟁 조건 취약점이란 무엇입니까?
당신과 같은 독자는 MUO를 지원하는 데 도움이 됩니다. 귀하가 당사 사이트의 링크를 사용하여 구매할 때 당사는 제휴 수수료를 받을 수 있습니다.

경쟁 조건은 두 작업이 특정 순서로 발생해야 하지만 반대 순서로 실행될 때 발생합니다.





예를 들어, 다중 스레드 응용 프로그램에서 두 개의 개별 스레드가 공통 변수에 액세스할 수 있습니다. 결과적으로 한 스레드가 변수 값을 변경하면 다른 스레드는 최신 값을 무시하고 이전 버전을 계속 사용할 수 있습니다. 이것은 바람직하지 않은 결과를 초래할 것입니다.





MAKEUSEOF 오늘의 비디오

이 모델을 더 잘 이해하려면 프로세서의 프로세스 전환 프로세스를 자세히 살펴보는 것이 좋습니다.





프로세서가 프로세스를 전환하는 방법

최신 운영 체제 멀티태스킹이라고 하는 둘 이상의 프로세스를 동시에 실행할 수 있습니다. 이 과정을 관점에서 보면 CPU의 실행 주기 , 멀티태스킹이 실제로 존재하지 않는다는 것을 알 수 있습니다.

대신 프로세서는 동시에 실행하거나 최소한 그렇게 하는 것처럼 작동하기 위해 프로세스 간에 지속적으로 전환합니다. CPU는 완료되기 전에 프로세스를 중단하고 다른 프로세스를 재개할 수 있습니다. 운영 체제는 이러한 프로세스의 관리를 제어합니다.



예를 들어 가장 간단한 스위칭 알고리즘 중 하나인 라운드 로빈 알고리즘은 다음과 같이 작동합니다.

  CPU가 현재 실행 중인 1개의 활성 프로세스와 대기 중인 3개의 대기 프로세스를 보여주는 다이어그램

일반적으로 이 알고리즘을 사용하면 운영 체제가 결정하는 대로 각 프로세스가 매우 짧은 시간 동안 실행될 수 있습니다. 예를 들어, 이것은 2마이크로초의 기간일 수 있습니다.





CPU는 각 프로세스를 차례로 수행하고 2마이크로초 동안 실행되는 명령을 실행합니다. 그런 다음 현재 프로세스가 완료되었는지 여부에 관계없이 다음 프로세스로 계속됩니다. 따라서 최종 사용자의 관점에서 둘 이상의 프로세스가 동시에 실행되는 것처럼 보입니다. 그러나 뒤에서 보면 CPU는 여전히 순서대로 일을 하고 있습니다.

그건 그렇고, 위의 다이어그램에서 볼 수 있듯이 라운드 로빈 알고리즘에는 최적화 또는 처리 우선 순위 개념이 없습니다. 결과적으로 실제 시스템에서는 거의 사용되지 않는 다소 기초적인 방법입니다.





이제 이 모든 것을 더 잘 이해하기 위해 두 개의 스레드가 실행 중이라고 상상해 보십시오. 스레드가 공통 변수에 액세스하면 경쟁 조건이 발생할 수 있습니다.

웹 애플리케이션 및 경쟁 조건의 예

지금까지 읽은 모든 내용의 구체적인 예를 반영하려면 아래의 간단한 Flask 앱을 ​​확인하세요. 이 응용 프로그램의 목적은 웹에서 발생할 금전 거래를 관리하는 것입니다. 라는 파일에 다음을 저장합니다. 돈.py :

E9332374EFFBB51ABFD386CECF7114F9C49CAB05

이 코드를 실행하려면 계정 테이블에 레코드를 만들고 이 레코드에 대한 트랜잭션을 계속해야 합니다. 코드에서 볼 수 있듯이 이것은 테스트 환경이므로 테이블의 첫 번째 레코드에 대해 트랜잭션을 수행합니다.

from money import db 
db.create_all()
from money import Account
account = Account(5000)
db.session.add(account)
db.session.commit()

이제 잔액이 ,000인 계정이 생성되었습니다. 마지막으로 Flask 및 Flask-SQLAlchemy 패키지가 설치된 경우 다음 명령을 사용하여 위의 소스 코드를 실행합니다.

python money.py 

따라서 간단한 추출 프로세스를 수행하는 Flask 웹 애플리케이션이 있습니다. 이 애플리케이션은 GET 요청 링크를 사용하여 다음 작업을 수행할 수 있습니다. Flask는 기본적으로 5000 포트에서 실행되므로 액세스하는 주소는 다음과 같습니다. 127.0.0.1:5000/ . 앱은 다음 엔드포인트를 제공합니다.

  • 127.0.0.1:5000/ 현재 잔액을 표시합니다.
  • 127.0.0.1:5000/보내기/{금액} 계정에서 금액을 뺍니다.
  • 127.0.0.1:5000/재설정 계정을 ,000로 재설정합니다.

이제 이 단계에서 경쟁 조건 취약성이 어떻게 발생하는지 조사할 수 있습니다.

경쟁 조건 취약성의 확률

위의 웹 응용 프로그램에는 가능한 경쟁 조건 취약점이 포함되어 있습니다.

안드로이드 TV 박스는 무엇입니까

을 보낼 두 개의 다른 HTTP 요청으로 시작하여 ,000가 있다고 상상해 보십시오. 이를 위해 링크에 두 개의 다른 HTTP 요청을 보낼 수 있습니다. 127.0.0.1:5000/보내기/1 . 일단 가정한다. 웹 서버 첫 번째 요청을 처리하면 CPU는 이 프로세스를 중지하고 두 번째 요청을 처리합니다. 예를 들어 다음 코드 줄을 실행한 후 첫 번째 프로세스가 중지될 수 있습니다.

account.amount = int(account.amount) - amount 

이 코드는 새 합계를 계산했지만 아직 데이터베이스에 레코드를 저장하지 않았습니다. 두 번째 요청이 시작되면 동일한 계산을 수행하여 데이터베이스의 값(,000)에서 을 빼고 결과를 저장합니다. 첫 번째 프로세스가 다시 시작되면 가장 최근의 계정 잔액을 반영하지 않는 자체 값(,999)을 저장합니다.

따라서 두 개의 요청이 완료되었으며 각각 계정 잔액에서 를 빼야 ,998의 새 잔액이 생성됩니다. 그러나 웹 서버가 처리하는 순서에 따라 최종 계정 잔액은 ,999가 될 수 있습니다.

5초의 시간 프레임에 대상 시스템에 전송을 위해 128개의 요청을 보낸다고 상상해 보십시오. 이 거래의 결과 예상 계정 명세서는 ,000 - 8 = ,875입니다. 그러나 경쟁 조건으로 인해 최종 잔액은 ,875에서 ,999 사이로 달라질 수 있습니다.

프로그래머는 보안의 가장 중요한 구성 요소 중 하나입니다.

소프트웨어 프로젝트에서 프로그래머는 꽤 많은 책임을 져야 합니다. 위의 예는 간단한 송금 신청을 위한 것입니다. 은행 계좌 또는 대규모 전자 상거래 사이트의 백엔드를 관리하는 소프트웨어 프로젝트에서 작업한다고 상상해 보십시오.

이러한 취약성을 보호하기 위해 작성한 프로그램이 취약하지 않도록 하려면 이러한 취약성에 대해 잘 알고 있어야 합니다. 여기에는 강력한 책임이 필요합니다.

경쟁 조건 취약점은 그 중 하나일 뿐입니다. 어떤 기술을 사용하든 작성하는 코드의 취약점을 조심해야 합니다. 프로그래머로서 얻을 수 있는 가장 중요한 기술 중 하나는 소프트웨어 보안에 대한 친숙함입니다.