固定サイズバッファ(配列)が安全ではないのはなぜですか?
-
04-10-2019 - |
質問
7バイト(または3または777)の値タイプが欲しいとしましょう。
私はそれをそのように定義することができます:
public struct Buffer71
{
public byte b0;
public byte b1;
public byte b2;
public byte b3;
public byte b4;
public byte b5;
public byte b6;
}
それを定義するより簡単な方法は、固定バッファーを使用することです
public struct Buffer72
{
public unsafe fixed byte bs[7];
}
もちろん、2番目の定義はより簡単です。問題は、固定バッファーに提供する必要がある安全でないキーワードにあります。これはポインターを使用して実装されているため、安全ではないことを理解しています。
私の質問は、なぜそれが安全ではないのかということです。 C#が任意の定数アレイを提供し、C#参照タイプのアレイまたは安全でないバッファーにする代わりに、それらを値タイプとして保持できないのはなぜですか?
解決
「固定バッファ」は実際の配列ではないためです。これはカスタム値タイプであり、私が知っているC#言語で生成する唯一の方法についてです。 CLRが配列のインデックス作成が安全な方法で行われることを確認する方法はありません。コードも検証できません。これの最もグラフィックデモンストレーション:
using System;
class Program {
static unsafe void Main(string[] args) {
var buf = new Buffer72();
Console.WriteLine(buf.bs[8]);
Console.ReadLine();
}
}
public struct Buffer72 {
public unsafe fixed byte bs[7];
}
この例では、スタックフレームに任意にアクセスできます。標準的なバッファーオーバーフローインジェクションテクニックは、機能的なコードにパッチを当て、コードを任意の場所にジャンプさせるための悪意のあるコードが利用できます。
はい、それは非常に安全ではありません。
所属していません StackOverflow