Veracode CWE ID 416: Use After Free



如何修复Veracode免费后使用(CWE ID 416)

Veracode推荐:确保一旦它们所指向的内存被释放,所有指针都被设置为NULL。

错误指向:第8行"return result ">

+ (NSData *)dataFromBase64String:(NSString *)aString
{
NSData *data = [aString dataUsingEncoding:NSASCIIStringEncoding];
size_t outputLength = 0;
void *outputBuffer = NewBase64Decode([data bytes], [data length], &outputLength);
NSData *result = [NSData dataWithBytes:outputBuffer length:outputLength];
free(outputBuffer);
return result;
}

Veracode扫描只是帮助您在代码中找到可以改进安全性相关代码的地方。当然,它不能阻止攻击,但是如果你的应用程序真的是面向安全的,你可以让读取处理后剩下的内存变得更加困难。

单词"Error"在Veracode的日志记录可能有点过度使用…
但是我对VeracodesError pointed on: Line 8 "return result;"的建议是…

+ (NSData *)dataFromBase64String:(NSString *)aString
{
if (aString!=nil && [aString length]) {
size_t outputLength = 0;
void *outputBuffer = NULL;
NSData *data = [aString dataUsingEncoding:NSASCIIStringEncoding];
outputBuffer = NewBase64Decode([data bytes], [data length], &outputLength);
if (outputBuffer==NULL) return nil; //if NewBase64Decode() failed there is nothing to free..
NSData *result = [NSData dataWithBytes:outputBuffer length:outputLength];
free(outputBuffer);
outputBuffer = NULL;
return result;
}
return nil;
}

这是因为没有你的意图,空闲内存不会被设置为NULL,所以有人扫描内存的剩余可能会发现一些线索,关于地址的前内容。

这里有一些很好的讨论,如果真的需要free之后的NULL

如果你做了那么多的细节来避免任何类型的风险,那么你也可以在使用它之前用NULL (void* outputBuffer = NULL;)初始化outputBuffer。

这是另一个讨论,如果这是有点过分的一些objC代码,只是搅拌可以覆盖整个方法。

编辑:更多的spagetti代码,试图避免返回除void以外的任何值,而是更改传递的参数。

+ (void)dataFromBase64String:(NSString *)aString toResult:(NSData**)result
{
if (aString!=nil && [aString length]) {
size_t outputLength = 0;
void *outputBuffer = NULL;
NSData *data = [aString dataUsingEncoding:NSASCIIStringEncoding];
outputBuffer = NewBase64Decode([data bytes], [data length], &outputLength);
if (outputBuffer==NULL) return; //if NewBase64Decode() failed there is nothing to do
*result = [NSData dataWithBytes:outputBuffer length:outputLength];
free(outputBuffer);
outputBuffer = NULL;
}
}
//and call like..
NSData *myresult = nil;
[YOURCLASS dataFromBase64String:@"someString" toResult:&myresult];
NSLog(@"result=%@",myresult);

现在我想知道Veracode在上面的编辑报告了什么。

相关内容

  • 没有找到相关文章

最新更新