문제

누구든지 환경 변수, 특히 UNIX 및 변형에 대해 지정된 경로를 통해 파일 액세스 보안을 처리하는 일부 코드를 지적 할 수 있지만 Windows 솔루션도 관심이 있습니까?

이것은 큰 긴 질문입니다 - 나는 그것이 So 패러다임에 얼마나 잘 맞는지 잘 모르겠습니다.

이 시나리오를 고려하십시오.

배경:

  • 소프트웨어 패키지 PQR은 사용자가 선택한 위치에 설치할 수 있습니다.
  • 환경 변수 $ pqrhome은 설치 디렉토리를 식별하는 데 사용됩니다.
  • 기본적으로 $ pqrhome 아래의 모든 프로그램 및 파일은 특수 그룹 인 PQRGRP에 속합니다.
  • 마찬가지로 $ pqrhome 아래의 모든 프로그램과 파일은 특별한 사용자, pqrusr 또는 사용자 루트 (그리고 그 루트 프로그램)에 속합니다.
  • 몇 가지 프로그램은 pqrusr입니다. 몇 가지 프로그램은 SGID PQRGRP입니다.
  • 대부분의 디렉토리는 PQRUSR이 소유하고 PQRGRP에 속합니다. 일부는 다른 그룹에 속할 수 있으며 해당 그룹의 구성원은 소프트웨어로 추가 권한을 얻습니다.
  • PQRGRP의 구성원이 아닌 사람들이 특권을 가진 많은 실행 파일을 운영해야합니다. 프로그램은 사용자 가이 질문에 직접 관련이없는 Arcane 규칙에 따라 실행할 수 있음을 확인해야합니다.
  • 스타트 업 후, 특권 프로그램 중 일부는 평생 동안 많은 사용자를 대신하여 행동 할 수있는 장기 실행 데몬이기 때문에 높은 특권을 유지해야합니다.
  • 이 프로그램은 다양한 비난의 이유로 디렉토리를 $ pqrhome으로 변경할 수있는 권한이 없습니다.

현재 점검 :

  • 이 프로그램은 현재 $ pqrhome과 그 아래의 주요 디렉토리가 '안전하다'(PQRUSR이 소유하고 PQRGRP에 속하며 공개 쓰기 액세스 권한이 없음)인지 확인합니다.
  • 그 후, 프로그램은 환경 변수의 전체 가치를 통해 $ pqrhome 아래 파일에 액세스합니다.
  • 특히, G11N 및 L10N은 '안전한'디렉토리의 파일에 액세스하고 해당 디렉토리의 파일에서 Printf () 등에 대한 형식 문자열을 읽음으로써 $ pqrhome에서 파생 된 전체 pathname과 알려진 하위 구조를 사용하여 달성됩니다. 예를 들어, $ pqrhome/g11n/en_us/messages.l10n).

$ pqrhome의 '설치된'값이 /opt /pqr이라고 가정하십시오.

알려진 공격 :

  • 공격자는 pqrhome =/home/Attacter/PQR을 설정합니다.
  • 이것은 실제로 /opt /pqr의 심볼릭 링크이므로 PQR 프로그램 중 하나가 PQR-Victim이라고 부르면 디렉토리를 확인하고 올바른 권한이 있습니다.
  • 보안 검사가 성공적으로 완료된 직후, 공격자는 Symlink를 변경하여/HOME/ATVACTION/BOGUS-PQR을 가리키며 공격자의 통제하에 있습니다.
  • PQR-Victim이 이제 안전한 디렉토리 아래에서 파일에 액세스 할 때 끔찍한 일이 발생합니다.

PQR은 현재 설명 된대로 행동하고 있으며 대규모 패키지 (수백만 줄의 코드 라인, 10 년 이상 다양한 코딩 표준으로 개발되었습니다. 어쨌든 자주 무시 되었음) 문제?

알려진 옵션은 다음과 같습니다.

  1. 형식 문자열에 대한 실제 인수를 확인하는 모든 형식의 형식을 사용하여 형식 문자열에 대한 실제 인수를 확인하고 실제 유형이 함수에 전달 된 추가 인수를 변경합니다. (이것은 까다 롭고 잠재적으로 오류가 발생하기 쉽습니다. 수많은 형식 조작이 변경 될 예정이지만 확인 함수 자체가 사운드 인 경우 잘 작동합니다.)
  2. PQRHOME 로의 직접 경로를 설정하고 보안 (아래 세부 사항)을 검증하고 안전하지 않은 경우 시작을 거부 한 후 $ PQRHOME의 값이 아닌 직접 경로를 사용하지 않습니다 (다른 경우). (이를 위해서는 $ pqrhome을 사용하는 모든 파일 작업이 getenv ()의 값을 사용하지 않고 매핑 된 경로를 사용해야합니다. 예를 들어,/home/fattacter/pqr이/opt/pqr에 대한 상징적 인 소프트웨어를 설정해야합니다. /opt/pqr 로의 경로가 안전하다고, 그 후 파일이 $ pqrhome/some/the로 참조 될 때마다 사용 된 이름은/opt/pqr/some/home/taketer/pqr/somes입니다. /사물. 이것은 대형 코드 기반입니다 - 고치기가 사소하지 않습니다.)
  3. Symlinks를 통한 추적조차도 $ pqrhome의 모든 디렉토리가 안전하고 (아래 세부 사항, 다시) 소프트웨어가 불안한 경우 시작을 거부하는지 확인하십시오.
  4. 소프트웨어 설치 위치로의 경로를 하드 코딩합니다. (이것은 PQR이 작동하지 않습니다. 다른 것이 없다면 테스트를 지옥으로 만듭니다. 사용자에게는 하나의 버전을 설치할 수 있고 업그레이드 등이 병렬 실행이 필요하다는 것을 의미합니다. PQR에는 작동하지 않습니다.)

안전한 경로에 대한 제안 된 기준 :

  • 각 디렉토리에 대해 소유자는 신뢰해야합니다. (근거 : 소유자는 언제든지 권한을 변경할 수 있으므로 소유자는 소프트웨어의 보안을 깨뜨리는 무작위로 변경하지 않도록 신뢰해야합니다.)
  • 각 디렉토리에 대해 그룹은 쓰기 권한이 없어야하거나 (그룹의 구성원은 디렉토리 내용을 수정할 수 없음) 그룹을 신뢰해야합니다. (이론적 근거 : 그룹 구성원이 디렉토리를 수정할 수 있다면 디렉토리의 보안을 깨뜨릴 수 있으므로 변경할 수 없거나 변경하지 않도록 신뢰해야합니다.)
  • 각 디렉토리에 대해 '다른 사람'은 디렉토리에 쓰기 권한이 없어야합니다.
  • 기본적으로 사용자 루트, 빈, SYS 및 PQRUSR을 신뢰할 수 있습니다 (빈과 SYS가 존재하는 경우).
  • 기본적으로 GID = 0 (루트, 휠 또는 시스템으로 다양하게 알려짐), 빈, SYS 및 PQRGRP를 가진 그룹을 신뢰할 수 있습니다. 또한 루트 디렉토리를 소유 한 그룹 (MacOS X에서 관리자라고 함)을 신뢰할 수 있습니다.

posix 함수 realpath() /홈/공격자/PQR을/opt/pqr로 매핑하는 매핑 서비스를 제공합니다. 보안 검사를 수행하지는 않지만 해결 된 경로에서만 수행해야합니다.

따라서 모든 배경으로, 보안을 보장하기 위해 모호한 관련 회수를 거친 알려진 소프트웨어가 있습니까? 이것은 지나치게 편집증입니까? (그렇다면 왜 - 정말 확실합니까?)

편집 :

다양한 의견에 감사드립니다.

@S.Lott : 공격 (질문에 요약 된)은 (문제에 요약 된) (적어도 하나의 setUID 루트 프로그램이) (비공식적) 사용자가 선택한 형식 문자열을 사용하여 프로그램을 충돌시킬 수 있으므로 가장 많이 얻을 수 있음을 의미합니다. 루트 쉘. 운 좋게도 로컬 쉘 액세스가 필요합니다. 원격 공격이 아닙니다. 그곳에 도착하기 위해서는 무시할 수없는 양의 지식이 필요하지만 전문 지식이 '밖으로'아니라고 가정하는 것은 현명하지 않다고 생각합니다.

따라서 내가 설명하는 것은 '형식 문자열 취약점'이며 알려진 공격 경로는 프로그램을 위조하여 보안 메시지 파일에 액세스하고 있다고 생각하지만 실제로는 메시지 파일 (형식 문자열이 포함 된 메시지 파일)을 사용합니다. 소프트웨어 제어가 아닌 사용자의 제어하에 있습니다.

도움이 되었습니까?

해결책

옵션 2가 작동합니다. 새 값을 작성하는 경우 $PQRHOME 실제 경로를 해결 한 후 보안을 확인한 후. 그렇게하면 코드가 거의 필요하지 않습니다.

setuid 권한을 유지하는 한, 실제 사용자의 입력과 관련된 모든 작업이 실제 UID에서 실행되도록 일종의 권한 분리를 수행 할 수있는 경우 도움이됩니다. 권한있는 프로세스와 실제 과정은 socketpair 또는 그와 비슷한 것.

다른 팁

글쎄요 소리 편집증이지만 응용 프로그램이 실행중인 시스템에 따라 다르고 공격자가 수행 할 수있는 피해에 따라 다릅니다.

따라서 사용자 기반이 적대적이고 손상이 매우 높으면 옵션 4로 갈 것입니다. 그러나 단점을 제거하기 위해 다음과 같이 수정됩니다.

두 가지 관련성을 인용하겠습니다.

1)

이 프로그램은 현재 $ pqrhome과 그 아래의 주요 디렉토리가 '안전하다'(PQRUSR이 소유하고 PQRGRP에 속하며 공개 쓰기 액세스 권한이 없음)인지 확인합니다.

2)

그 후, 프로그램은 환경 변수의 전체 가치를 통해 $ pqrhome 아래 파일에 액세스합니다.

실제로 전체 경로를 하드 코딩 할 필요는 없으며, 1)에서 언급 한 "프로그램"에서 1)에서 언급 된 경로까지의 상대 경로 만 하드 코딩 할 수 있습니다.

제어 문제 :

a) 실행 파일의 경로와 파일의 경로 사이에 "공격자-접근 가능"(예 : Symlinks)이 없음을 확인해야합니다.

b) 실행 파일이 자신의 경로를 신뢰할 수있는 방식으로 점검해야하지만, 내가 아는 모든 unx 's에서 문제가되지는 않습니다 (그러나 나는 모두 알지 못하고 Windows를 모릅니다. 조금도).


세 번째 댓글 다음에 편집 :

OS 지원 /Proc, Syslink /Proc /$ {PID} /exe가 B를 해결하는 가장 좋은 방법입니다)


자고 후 편집 :

설치가 "안전한"프로세스입니까? 그렇다면 설치 시간에 래퍼 스크립트를 만들 수 있습니다. 이 스크립트는 실행 가능하지만 쓰기는 안되어야합니다. $ pqrhome env var를 "안전한"값으로 설정 한 다음 실제 프로그램을 호출합니다 (결국 다른 유용한 일도 할 수 있습니다). Unix에서 실행되는 과정의 ENV VAR. 할 수 없습니다 달리기 프로세스 이외의 다른 것에 의해 변경되면 안전합니다 (물론 Env Vars ~할 수 있다 부모가 변경합니다 ~ 전에 프로세스가 시작됩니다). 그래도이 접근법이 Windows에서 작동하는지 모르겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top