PHP exec()는 실행된 명령을 어디에나 저장합니까?

PHP exec()는 실행된 명령을 어디에나 저장합니까?

PHP 웹 애플리케이션에 다음 코드가 있다고 가정해 보겠습니다.

$encrypt ? $password = generatePassword($passwordstrength): $password="";
$estring = "7z a -p$password -mx0 packFoo.aes.7z mydir/foo";
if($encrypt) {
    exec($estring);
}
mailuser($password);//uses standard PHP mail function

비밀번호는 PHP rand() 함수를 사용하여 무작위로 생성됩니다.

/var/logs나 .bash_history에서 비밀번호를 찾을 수 없습니다.

서버가 손상된 경우 $password 값을 서버에서 복구할 수 있는지 알고 싶습니다. 마지막으로,$password 값이 서버에 저장되지 않는다고 주장할 수 있나요?

답변1

~처럼매트가 댓글에서 지적했어요, 특별히 감사를 설정하지 않는 한 그럴 가능성은 없습니다.스스로 명령을 내리다의도적으로 어디에든 직접 액세스할 수 있는 형식으로 저장됩니다. grep -lR ... /루팅은 깨달음을 주는 경험이 될 수 있기 때문입니다(먼저 모든 것을 다시 설치하는 것이 좋습니다 noatime...).

그러나 항상 "그러나"가 있습니다. 이 경우(특히 표시된 코드에서 $password 또는 $estring 변수를 안전하게 지우지 않은 경우) 내가 볼 수 있는 한 가지 확실한 가능성은 이러한 변수가 swap space 에 기록될 수 있다는 것입니다. 이는 활성 공격자가 없더라도 적어도 일정 기간 동안은 영구 저장에 전념한다는 의미입니다. 이는 스왑을 완전히 비활성화하거나 무작위 암호화 키로 암호화된 스왑을 실행하여 크게 완화할 수 있습니다. 이렇게 하면 재부팅 후 스왑에 액세스할 수 없게 됩니다(시스템 RAM이 지워지면 이를 이해하는 데 필요한 암호 해독 키가 손실되기 때문입니다).

저 할 수 있어요상상하다7zip은 더 이상 필요하지 않은 즉시 명령줄과 내부 변수에서 비밀번호를 신속하게 지울 만큼 성능이 뛰어납니다. 그러나 확장 키 계획과 같은 항목은 장기간 유지되어 교체될 가능성이 높아집니다. 가능성. 이를 통해 반드시 비밀번호를 복구할 수 있는 것은 아니지만 암호화된 아카이브에서 일반 텍스트를 복구할 수 있을 가능성이 높습니다. 적절한 시점에 간단한 명령을 실행하면 ps axw명령줄에서 일반 텍스트로 비밀번호를 기록하는 사람이 표시되지만, 그렇지 않습니다.저장됨그리고 기회의 창은 작습니다.

이메일을 보낼 때 일반 텍스트(또는 Base64로 인코딩된 메시지 본문과 같이 해당 일반 텍스트로 쉽게 내보낼 수 있는 내용)의 비밀번호가 포함되어 있다고 가정합니다.그 이메일은 거의 확실했어요~ 할 것이다시스템의 메일 대기열에 임시로 쓰기이는 비밀번호가 결국 디스크에 저장된다는 의미입니다(RAM 디스크에 메일 큐 디렉터리가 없으면 메일 큐가 영구 저장소에 있어야 한다는 사실 외에도 작동상 자체적인 문제가 발생합니다). ). 특히 스마트 호스트 설정을 실행하는 경우 대기열 파일이 빠르게 삭제될 수 있지만 디스크에 기록되었으므로 말하자면 "손상이 완료되었습니다". strings /dev/sd?메시지가 통과하는 모든 서버에서 이 위협을 완화하기 위한 특별한 조치를 취하지 않는 한, 이와 같은 방법은 무엇을 찾아야 할지 아는 사람에게 비밀번호 복구를 제공할 수 있습니다.

물론 이메일은 원래 완전히 안전하도록 설계되지 않았습니다. SMTP를 통해 이메일을 보낼 때 기밀성을 합리적으로 보장할 수 있는 유일한 방법(SSL 또는 STARTTLS를 통해 SMTP를 사용하는 경우에도)체인 전체에 걸쳐메일 서버)은 S/MIME 또는 OpenPGP와 같이 종단 간 암호화됩니다.

간단히 말해서:귀하의 웹 애플리케이션아마도명령(비밀번호 포함) 또는 비밀번호 자체는 의도적으로 어디에도 저장되지 않지만, 이것이 의존하는 다른 구성요소는 정상 작동 중에 저장될 수 있습니다.

답변2

먼저, 더 큰 보안 문제가 있다는 점에 유의하세요.rand()비밀번호 생성에 적합하지 않음. 빠르고 예측 가능한 의사 난수 생성기를 사용합니다. 사용openssl_random_pseudo_bytes()반대로, 다음과 같이문서.


명령의 이름을 기록하는 것은 일반적이지만 해당 인수를 기록하는 것은 그리 일반적이지 않습니다. 따라서 서버가 비정상적인 양의 로깅에 대해 구성되지 않는 한 암호는 시스템 로그에 남지 않습니다.

동시에 실행 중인 프로세스는 명령줄을 들을 수 있으며 7z실행만 하면 됩니다 ps.

-p( )만 전달하면 7z a -p -mx0 packFoo.aes.7z mydir/foo명령줄에 비밀번호를 입력하는 것을 피할 수 있습니다. 이 경우에는 다음을 사용해야 합니다.예상되는7z비밀번호가 터미널에서 나오며 두 번 입력된다고 주장하므로 비밀번호를 두 번 보냅니다 .여기SSH와 비슷한 예입니다.

반면, 비밀번호는 일정 기간 동안 파일 시스템에 저장됩니다. 메일 백엔드의 임시 파일에 확실히 저장됩니다. 이메일이 전송된 후 임시 파일은 삭제되지만 여유 공간을 읽기 위해 디스크에 직접 액세스하는 루트로 실행되는 프로세스에서 비밀번호에 계속 액세스할 수 있습니다. 비밀번호가 어느 시점에 바뀌었을 수도 있습니다.

관련 정보