几天前我在一次采访中,得到了以下要求:
编写库函数以查找数组的MIN元素。尽可能确保安全。好吧,所以很明显那里的重音在证券上。语言是C,公司位于嵌入式领域。后来我问面试官是否至少可以向我解释这里的情况,因为我真的很想学习,但是他不是很健谈...所以,我把google颠倒了,但我没有特别发现此请求的解决方案。我对C很陌生。这里可能发生哪些安全漏洞?什么是红旗?我知道我们应该注意数组边界,因为溢出它会导致内存问题,并且我们可以轻松地从随机内存中进行写入/读取。但是除此之外,我应该寻找什么?任何反馈将非常有用!谢谢一群!
实际上只有两种方法可以在C中搜索数组。要么明确告诉您数组中存在多少个元素,要么可以检查某种值以指示数组结尾(例如[ C0](用于字符串)。
例如,如果使用第一种情况,那么我们有一个'\0'
的数组,则此:
int
是很好的解决方案。如果我们使用第二种情况,例如,我们有一个C字符串形式的数组int minInt(int array[],size_t num_elements){
if(array==NULL || num_elements==0)
return -1;
size_t i;
int min = array[0];
for(i = 1; i < num_elements; ++i)
if(array[i] < min)
min = array[i];
return min;
}
,并且char
代表数组的结尾,那么可能是这样:
'\0'
...将是一个很好的回应。这在很大程度上取决于系统的细节,并且第二种情况只有在您可以确定停止值没有丢失的情况下才是安全的。
要考虑两个方面:
正如您提到的,您使用的是C语言,这是一种低级语言,函数可以很容易地弄乱并访问错误的内存位置,特别是当有许多指针在传递时。因此,始终要确保要访问的数组的边界是什么,并强制执行一些规则以避免传递边界,这始终是一件好事。
当攻击者更改参数,以便函数可能从阵列外部的内存位置返回数据时,可能会发生某些安全攻击!使用不同的更改参数多次重复该过程,并且内存中的数据会泄漏!
仅当您知道有多个线程在同一个程序上运行时才适用,然后您可能需要一个关键部分来锁定函数正在使用的数组。
我相信您会在网上找到的大多数功能都能安全地完成工作,也许您的面试官只是想让您与他讨论可能发生的威胁和攻击,以及您如何了解它们。