다음 바이너리에서 사용할 환경 변수를 수정하는 간단한 bash 스크립트가 있습니다. 기본 스크립트 :쉘 shock 고정 bash 버전이있는 임포트되지 않은 환경 변수
#!/bin/bash
export DBROOT="NEW_DIRECTORY"
export TERM=xterm
su -c " <test_process> " - omni
"test_process"는 환경 변수로 DBROOT 변수를 사용합니다. 또한 DBROOT는 글로 z 환경 변수로 다른 값 "OLD_DIRECTORY"로 정의됩니다. 스크립트의 목표는 "test_process"가 NEW_DIRECTORY 값 (내 보낸 값)을 사용하도록 강제하는 것입니다.
비 패치 bash 버전에서는 테스트가 효과적이었습니다. 그러나 bash에서 shellshock 버그를 패치 한 후에 test_process는 글로벌 환경 변수가 아닌 DBROOT의 내 보낸 값을 읽지 않습니다. 마치 "test_process"가 내 보낸 변수와 전역 변수를 무시하는 것과 같습니다.
"test_process"소스 코드가 없습니다. 배쉬 버전 (bash는-2.05b-41.7.i386.rpm이다 RPM 버전)을 -release (1) 버전 2.05b.0 내가 릴리스 3
AS 은 Red Hat Enterprise Linux에서 실행 해요업데이트 : 컴파일 시간을 정의에게
#define NON_INTERACTIVE_LOGIN_SHELLS
을 설정하여 bash는 2.05b 마지막으로 소스를 컴파일 한 후 스크립트를 다시했다. 이 정의가 없으면 bash는 su
명령 뒤에 -
문자를 잘못 해석했습니다.
포탄 이동을위한 최종 승인 패치는 함수를 자체 네임 스페이스로 내 보낸 (그리고 파서 버그를 수정합니다). 물론 RHEL3의 고대 쉘로 백 포팅 한 사람이라면 실수를 저지를 수 있었을 지 모르지만 여기에 코드에 영향을 줄 것이라고 믿는 것이 다소 어렵습니다. 또한 'su'는 일반적으로 움직이는 부분이 많습니다. 쉘 외부에서 잘못 될 수있는 부분이 없습니다. –
아무튼 - 만약'su'가 문제가 아니라는 것을 확실하게 알고 싶다면 그냥 꺼내서 재현 할 수 있는지 확인하십시오; ('su' 명령 대신)'bash'를 마지막으로 실행하여 문제를 일으킬 수 있다면'DBROOT'가 설정되어 있는지 확인하십시오. 실제로 그 시점에서 설정되어 있지 않다면, 시스템의 다른 곳에서 발생하는 것이 아니라 배포판의 쉘 샷 패치의 버그라는 것을 알게됩니다. –
'su'는 일반적으로 pre-su 환경 변수를 의도적으로 덤프합니다. 그렇지 않으면 보안 문제가됩니다. 플래그는 실제로는 두 개입니다 :'-m'. 고대 버전 AS 3이 사용하고있는 모든 것이 사실인지 전혀 모르겠지만. –