以下は、私が書いたプログラムの小さな抜粋です。ルーチンは (パーミッション 0600) を通過しfilenamelist
ます。これには、ファイル拡張子. ファイル名のリストは、プログラムの別の部分から取得されます。directory
FileOne\nAnotherFile\nThird file\n
EXTENSION
filenamelist
システム上の他のファイルを削除するために悪用される可能性があることを少し心配しています. それをロックするより良い方法はありますか?もともと、削除するファイルへのフルパスを保存していましたが、後でディレクトリとファイル拡張子を分離してハードコーディングし、難読化しようとしました。
私は偏執狂的かもしれませんが、悪意のあるユーザー (!) がfilenamelist
何らかの方法で他のファイル パスで を汚染する可能性があります。たとえば、../../another-directory/donotdeleteme.sys
または私が考えることさえできない何らかの方法でそれをエスケープします。
では、以下の削除ルーチンを悪用して外部のファイルを削除することはできますdirectory
か? 大災害を防ぐためにさらにロックダウンする方法について何か提案はありますか?
PS: プログラムは、操作の一部としてユーザーのホーム ディレクトリ外のファイルを変更するため、ルートとして実行する必要があります。
#define EXTENSION ".stuff"
char *directory = calloc( 28 );
directory = "/usr/local/share/stuffings/";
char *filenamelist = calloc( 24 );
filenamelist = "/etc/stuffing/files.lst";
void delete_files( char* filenamelist, char* directory ) {
if ( access( filenamelist, F_OK | R_OK ) == 0 ) {
FILE *filenamelist_fp = fopen( filenamelist, "r" );
char filename[200];
while( fgets( filename, 200, filenamelist_fp ) != NULL ) {
char *pos;
char *path = calloc( ( strlen( directory ) + strlen( filename ) + strlen( EXTENSION ) + 1 ), sizeof( char ) );
if ( ( pos=strchr( filename, '\n' ) ) != NULL )
*pos = '\0';
strcat( path, directory );
strcat( path, filename );
strcat( path, EXTENSION );
if ( access( path, F_OK | W_OK ) == 0 )
unlink( path );
free( path );
}
fclose( filenamelist_fp );
unlink( filenamelist );
}
} /* © */