CWE-467:在指针类型上使用sizeof()
查看自定义信息:
![]() ![]()
![]() ![]()
![]() 语言 C(不确定的患病率) C ++(不确定的患病率) ![]()
示例1 应注意确保大小返回数据结构本身的大小,而不是指向数据结构的指针的大小。 在此示例中,sizeof(foo)返回指针的大小。
(不良代码)
示例语言:C
double *foo;
... foo =(double *)malloc(sizeof(foo)); 在此示例中,sizeof(*foo)返回数据结构的大小,而不是指针的大小。
(好代码)
示例语言:C
double *foo;
... foo =(double *)malloc(sizeof( *foo)); 示例2 此示例定义了固定的用户名和密码。AuthenticateUser()函数旨在接受不受信任的用户的用户名和密码,并检查以确保其与用户名和密码匹配。如果用户名和密码匹配,则AuthenticateUser()旨在表明身份验证成功。
(不良代码)
/* 忽略CWE-259(硬编码密码)和CWE-309(使用密码系统进行身份验证)在此示例中。*/ char *用户名=“ admin”; char *pass =“密码”; int authenticateuser(char *inuser,char *in pass){
printf(“ sizeof用户名=%d \ n”,sizeof(用户名));
printf(“ sizeof pass =%d \ n”,sizeof(pass)); if(strncmp(用户名,inuser,sizeof(用户名))){
printf(“使用sizeof \ n的用户名的身份失败”); }返回(auth_fail); /* 因为CWE-467,大小在许多平台和架构上返回4个。*/ 如果(!strncmp(Pass,intass,sizeof(pass))){
printf(“使用sizeof \ n的auth成功密码”); }返回(auth_success); 别的 {
printf(“使用sizeof \ n的auth失败密码”); }返回(auth_fail); int main(int argc,char ** argv) {
int authresult;
if(argc <3){
ExitError(“用法:提供用户名和密码”); }authResult = authenticateUser(argv [1],argv [2]); 如果(authresult!= auth_success){
ExitError(“身份验证失败”); }别的 {
doAuthenticatedTask(argv [1]); }在AuthenTicateUser()中,因为SizeOf()应用于具有数组类型的参数,因此SizeOf()调用可能在许多现代体系结构上返回4。结果,strncmp()调用仅检查输入密码的前四个字符,从而进行部分比较(CWE-187),导致身份验证不当(CWE-287)。 由于部分比较,这些密码中的任何一个仍将导致“ admin”用户成功的身份验证:
(攻击代码)
Pass5
Passabcdefgh 密码 因为只检查了4个字符,所以这大大减少了攻击者的搜索空间,使蛮力攻击更可行。 同样的问题也适用于用户名,因此“ AdminXyz”和“ Administrator”之类的值将为用户名取得成功。 ![]()
提供更多信息 - 请选择其他过滤器。
|
使用共同弱点枚举(CWE)和本网站的相关参考使用条款。CWE由美国国土安全部(DHS)网络安全和基础设施安全局(CISA),由国土安全系统工程和开发研究所(HSSEDI)由manbetx客户端首页(MITER)。版权所有©2006–2023,Miter Comanbetx客户端首页rporation。CWE,CWSS,CWRAF和CWE徽标是Miter Corporation的商标。manbetx客户端首页 |