[問題] strcpy memcpy strncpy 風險問題

作者: gn00618777 (非常念舊)   2020-09-19 09:53:15
網路上介紹 strcpy strcmp 這些相關function有些風險,就是可能會造成 memory
越界問題。所以使用 strncpy strncmp 這些來替代。
原因是strcmp(a,b),b若沒有空字元結尾,他會一直比下去,會有存取到未知memory
風險。所以用strncmp代替。
現在我開發nRF5 BLE 相關系列。BLE底層callback回來有 uint8_t *p_data 和長度。
我從APP傳過去是一個 device name,callback接收到後只會是hex byte由 p_data指向
請問你們把它存成字串會是怎樣的安全作法?
1 在BLE內先宣告長度20的陣列。array[0]= p_data
array[1]= p_data+1
..
array[18] = p_data+18
array[19] = '\0'
2 memcpy(array, p_data, sizeof(array));
第二種我不確定安不安全。假設p_data沒有到20那麼長,不就也會把p_data指向的
memory越界了嗎?
請多多指教QQ
作者: CoNsTaR ((const *))   2020-09-19 10:59:00
所以你才會需要 dependent types 啊?不過 cpp 的話放棄吧,不會有 dependent types 的 orz
作者: Lipraxde (Lipraxde)   2020-09-19 11:20:00
你要先知道 device name 最常能到多長,或是自己決定,太長就當掉。不然就是改用 malloc 的方式
作者: b0920075 (Void)   2020-09-19 12:37:00
把你要用的區域先初始化為0,確定複製字串的範圍不要超出大小就好了吧
作者: CoNsTaR ((const *))   2020-09-19 18:29:00
這很明顯就是須要 dependent types 啊,除了 dependent types(或靜態分析,如果陣列長度是編譯期確定的話)以外還有什麼方法可以在不改變 callback 實作的條件下確保沒有 out of bound access?不過如果你信任 callback 不會亂來的話,就用 malloc +清零的方式吧
作者: Lipraxde (Lipraxde)   2020-09-19 18:52:00
誒... callback 不是他自己寫嗎?還是我誤會了?OuO
作者: james732 (好人超)   2020-09-19 20:25:00
話說對array取sizeof是有點危險的
作者: Schottky (順風相送)   2020-09-19 20:58:00
strcmp 狀況不一樣,並不會有風險,比對到不同就停了strncmp 只是用在你只想比前 N 個字元的狀況那個 N 值並不適合用來做邊界限制
作者: b0920075 (Void)   2020-09-20 11:01:00
硬要說的話 strcmp 會有 side channel attack ,也不是多安全就是了
作者: CoNsTaR ((const *))   2020-09-20 13:48:00
strcmp 如果兩個字串相同而且都沒有結尾還是不安全吧?
作者: LPH66 (-6.2598534e+18f)   2020-09-21 18:46:00
那這就是不符合 strcmp 的要求的參數了 -- strcmp 是比較null-terminated string 的, 不是這樣的字串不能用cppref 上是寫若指標不是指向此種字串則是 UB也就是說: 很遺憾的, 又是個容易寫得出來的 UB
作者: CoNsTaR ((const *))   2020-09-22 01:07:00
不過說實在的,標準寫得再嚴格,它 type 就是長那樣標準說不允許的東西就是隨便都能造得出來要是文件、標準真的有用,幹嘛不通通寫文件就好了,還寫程式幹嘛 XD
作者: loveme00835 (髮箍)   2020-09-23 05:54:00
寫希佳佳分為兩種人: 追隨標準的人; 還有制定標準的人. 標準某種程度上來說反映了當代技術的水平, 還有寫碼習慣. 一個人如果明白語言定義的 abstract machine 和 physical machine 的差異以及設計目的, 那寫碼就會更有可攜性, 也更安全.
作者: gn00618777 (非常念舊)   2020-09-23 21:53:00
回某樓callback是BLE software ,是一個沙盒無法動我目前就是用既定大小的空間,先初始為0,並確保來的p_data大小不超過既定範圍
作者: Lipraxde (Lipraxde)   2020-09-24 01:45:00
雖然,還是不太懂你寫的是哪邊的程式,但是反正只要確保自己寫的程式是 OK 的,行有餘力再考慮怎麼避免其他人寫出有問題的就好。
作者: CoNsTaR ((const *))   2020-09-24 05:50:00
"abstract machine 和 physical machine" is a fancy wayof saying semantics lol, people who invented that should definitely get a nobel in literature imoAnd yeah that's exactly what I was taking about. Instead of having your types (which is the ACTUAL programthat you compile) correct, you choose to have your documents (which is a part of std) correct. I honestlykinda don't see how this whole "praising std" thingwould work, but I'll take your words for that beforeI finally figure it out. I mean, if I could.

Links booklink

Contact Us: admin [ a t ] ucptt.com