私はキューのこのCコードのセキュリティホールを見つけようとしています

私は、 malloc の部分について不気味なことがあることを知っていますが、これについては何が危険なのか見苦しくなっています。

//que structure
typedef struct queue{
         int *que; //the actual array of queue elements
         int head;  //the head index in que of the queue
         int count;  /// number of elements in queue
         int size;//max number of elements in queue
    } QUEUE;


void qManage(QUEUE **qptr, int flag, int size){
      if(flag){
              /* allocate a new queue */
              *qptr = malloc(sizeof(QUEUE));
              (*qptr)->head = (*qptr)->count = 0;
              (*qptr)->que = malloc(size * sizeof(int));
              (*qptr)->size = size;
    }
    else{
             /* delete the current queue */
             (void) free((*qptr)->que);
             (void) free(*qptr);
    }
}
0
答えは「あなたが大きさに負の値を渡すとどうなるでしょう?」と思うかもしれませんが、私は完全にはわかりません。
追加された 著者 Richard J. Ross III,
@アデル私は答えとして私のコメントを追加しました。それが本当に問題であれば、私の答えを受け入れることを忘れないでください。
追加された 著者 Richard J. Ross III,
@Adel mallocは実装仕様です。 GCCでコンパイルされた私のMacでは、 malloc(-1)はNULLを返します。 malloc(sizeof(QUEUE))がNULLを返す場合どうすればよいのでしょうか?を設定するためにnullを間接参照しようとすると、EXEC_BAD_ACCESSが返されます。 head
追加された 著者 Richard J. Ross III,
穴だけを見つける。私たちはすでにコードを持っています
追加された 著者 Coffee,
私はそれがチェックされていないことを知っているので、mallocは他のものをオーバーライドすることを考慮しません。または私はそれを逃していますか?
追加された 著者 Coffee,
@ RichardJ.RossIII - うーん、それは意味をなさないだろう、それを調べるだろう。どうもありがとう!
追加された 著者 Coffee,
@ RichardJ.RossIII - 素早くgoogle-searchを実行すると、mallocが無記名にすぎないので、ネガを渡すことはできません。値?
追加された 著者 Coffee,
この正確なコードをここで解読します: nob.cs.ucdavis.edu/bishop /secprog/robust.html
追加された 著者 NPE,
あなたがキューを作成しているのか、それとも削除しているのかを判断するフラグ、「フラグ」?あなたのAPIのユーザーをまず心配してください。彼らはセキュリティについて心配する機会を得る前に十分なダメージを与えます。
追加された 著者 Dave Newton,
アイテムの追加方法も重要です。
追加された 著者 Dave Newton,
もし誰かが許容されるmallocサイズより大きいQUEUEを渡すとどうなりますか?
追加された 著者 Spencer Rathbun,
割り当てがコードのセキュリティホールを見つけるか、キューを実装するのですか?
追加された 著者 Dan Fego,
それ以外の場合は、malloc()が失敗したかどうかをチェックしません。
追加された 著者 Fred,

1 答え

I'm pretty sure the problem this: What happens if you pass a negative value for 'size'?

もう一つの可能​​性のある問題は、割り振った後に * qptr​​ NULL にチェックしないことです。しかし、実際のコードではそれが問題になることはめったにありません。心配する他のエラーがあります。

2
追加された
@jeffsixが正しい。私はそれがそこに問題の一部であるかもしれないと信じています。
追加された 著者 Richard J. Ross III,
それはどれくらい割り当てるべきか、その値がどこから来るのかによって決まります。ユーザーが入力したものである場合、攻撃者はその入力を処理して膨大な量のメモリを割り当てようとすると失敗し、たとえ割り当てが行われていてもそのメモリに書き込むときにさまざまなメモリ攻撃を受ける可能性があります失敗します(他の使用中のデータに書き込むことができます)。
追加された 著者 jeffsix,