Hello there, ('ω')ノ
メモリ関連の脆弱性は非常に危険で。
このような脆弱性を防ぐために、プログラマは次のような。
安全なメモリ管理手法を採用できて。
・メモリに読み込まれるデータの量を制御する関数
・入力と入力サイズの検証
・バッファサイズに定数を使用
・メモリに読み込むときに比較演算子に注意
・フォーマット文字列での入力の回避
下記は、バッファオーバーフローの脆弱性を防ぐコードスニペットで。
printf("Enter the password:\n");
gets(userPass);
if(strncmp(userPass,PASSWORD,9)==0){
printf("PASSWORD VERIFIED\n");
}
⇩
下記は、入力のサイズを制御する関数('fgets')を使用して、脆弱性を防止して。
printf("Enter the password:\n");
fgets(userPass,9,stdin);
if(strncmp(userPass,PASSWORD,9)==0){
printf("PASSWORD VERIFIED\n");
}
下記は、バッファサイズの誤った計算を回避するためのベストプラクティスで。
char userPass[5];
printf("Enter the password:\n");
fgets(userPass,9,stdin);
if(strncmp(userPass,PASSWORD,BUFFER_SIZE)==0){
printf("PASSWORD VERIFIED\n");
}
⇩
下記は、BUFFER_SIZE定数を使用してバッファのサイズが一貫して。
割り当てられるようにすることで、脆弱性を防止して。
int BUFFER_SIZE = 9;
char userPass[BUFFER_SIZE];
printf("Enter the password:\n");
fgets(userPass,BUFFER_SIZE,stdin);
if(strncmp(userPass,PASSWORD,BUFFER_SIZE)==0){
printf("PASSWORD VERIFIED\n");
}
下記は、誤った比較演算子を使用すると、Off-by-oneが導入される欠陥を防いで。
int len = 0, total = 0;
while(1){
fgets(buff1, MAX_SIZE, stdin);
int len = strnlen(buff1, MAX_SIZE);
total += len;
if(total <= MAX_SIZE) strncat(buff2, buff1, len);
else break;
}
⇩
下記は、コードは「<」を使用しており、適切なタイミングで停止して。
int len = 0, total = 0;
while(1){
fgets(buff1, MAX_SIZE, stdin);
int len = strnlen(buff1, MAX_SIZE);
total += len;
if(total < MAX_SIZE) strncat(buff2, buff1, len);
else break;
}
フォーマット文字列インジェクションは、フォーマットパラメータのユーザ入力を。
連結または使用することによって引き起こされる脆弱性の一種で。
if(strncmp(userPass,PASSWORD,BUFFER_SIZE)==0){
printf("PASSWORD VERIFIED\n");
}
else{
printf("Invalid password:");
printf(userPass);
}
⇩
下記は、コードは入力をフォーマット引数として渡しておらず。
if(strncmp(userPass,PASSWORD,BUFFER_SIZE)==0){
printf("PASSWORD VERIFIED\n");
}
else{
printf("Invalid credentials.");
}
Best regards, (^^ゞ