Tag: 安全

检测windows上free()后的使用情况。 (悬挂指针)

我正在尝试检测“使用后免费()”错误,也称为“悬空指针”。 我知道Valgrind可以用来检测* nix平台上的“免费使用”错误,但是Windows呢? 如果我没有来源怎么办? 是否有比Valgrind更好的程序来检测程序中的所有悬空指针? 一个免费的开源将是首选,但我会使用商业解决方案,如果它将完成工作。

安全C和大学 – 训练缓冲区溢出

我最近在C完成了大学课程。所以我当然缺乏经验。 一些大学倾向于教他们的学生安全的编程, 或至少一些元素 。 甚至有一个video (从这里拍摄)。 在C中,复制字符串,据我所知 – strcpy或string.h函数。 如何在日常编程中安全地使用它? 你有一些函数,它们处理分配以防止缓冲区溢出吗? 有C的CERT安全编码标准 。 它提供示例和合规解决方案: int main(int argc, char *argv[]) { /* … */ char prog_name[128]; strcpy(prog_name, argv[0]); /* … */ } 他们的替代方案是: int main(int argc, char *argv[]) { /* … */ char *prog_name = (char *)malloc(strlen(argv[0])+1); if (prog_name != NULL) { strcpy(prog_name, argv[0]); } else […]

heartbleed bug是C中经典缓冲区溢出漏洞的表现吗?

在我们关于安全性的第一次CS讲座中,我们讨论了C的问题,没有检查所谓的缓冲区长度以及可以利用此漏洞的不同方式的一些示例。 在这种情况下,它看起来像是一个恶意读操作的情况,其中应用程序只读出了很多字节的内存 我是否正确断言Heartbleed错误是C缓冲区长度检查问题的表现? 为什么恶意使用在尝试读取其他应用程序的内存时不会导致分段错误? 在写入内存之前简单地将内存归零(然后随后从中读取)会导致分段错误吗? 或者这在操作系统之间有所不同吗? 或者其他一些环境因素? 显然无法识别漏洞的利用。 是因为心跳function在调用时不记录? 否则,对64k字符串的任何请求肯定是恶意的?

PHP的password_verify()是否可以安全地防止超长密码(DoS攻击)?

一般攻击情形: 在2013年,Django有一个普遍的漏洞,因为攻击者可以通过非常大的密码创建极其强大的CPU计算[ 请参阅此处的安全声明 ]。 我不确定在使用PHP的password_verify()和其他密码散列方法时是否仍然可以进行此操作而无需进一步检查。 PHP文档说: 对algo参数使用PASSWORD_BCRYPT将导致密码参数被截断为最大长度为72个字符。 但是,PHP的代码MAYBE说了一些不同的东西: 然而,PHP 5.5.0的password_verify()函数背后的C代码并不直接限制传递的参数(可能在bcrypt算法的更深层次上?)。 此外, PHP实现不限制参数。 问题是: password_verify() (以及相同function集的其他function)是否通过最大化POST参数容易受到DoS的攻击? 还请考虑POST上载大小远大于4MB的站点范围配置情况。

安全C编码实践

我正在寻找C语言中安全编码实践的全面记录。由于我还没有找到这样的列表,我们不妨将其转换为社区wiki,以供进一步参考。 我正在寻找安全问题的解决方案,如基于堆栈和堆的缓冲区溢出和下溢,整数溢出和下溢,格式字符串攻击,空指针解除引用,堆/内存检查攻击等。 注意:除了编码实践之外,还可以提到防御这类攻击的安全库。 LE:正如本问题中所见, 安全C ++编码实践,但仅适用于C语言。

使用堆溢出来写入任意数据

我一直在努力学习堆溢出攻击的基础知识。 我最感兴趣的是使用损坏或修改块元数据作为攻击的基础,但我也对其他建议持开放态度。 我知道我的挖掘目标应该是用challenge()函数指针覆盖printf() challenge()函数指针,但我似乎无法弄清楚如何实现该写入。 我有以下一段代码,我想利用它,它使用glibc 2.11.2 malloc : void challenge() { puts(“you win\n”); } int main(int argc, char **argv) { char *inputA, *inputB, *inputC; inputA = malloc(32); inputB = malloc(32); inputC = malloc(32); strcpy(inputA, argv[1]); strcpy(inputB, argv[2]); strcpy(inputC, argv[3]); free(inputC); free(inputB); free(inputA); printf(“execute challenge to win\n”); } 显然,实现对分配的块的元数据的实际覆盖是微不足道的。 但是,我还没有找到使用任何标准技术来利用此代码的方法。 我已阅读并尝试实施以下技术: 论文:关于堆溢出的 w00w00 虽然论文非常清楚,但是unlink技术已经过时了一段时间。 Malloc Maleficarum.txt […]

为什么free()在释放之前没有将内存清零?

当我们在C中free()内存时,为什么那个内存没有填充零? 在调用free()时,有没有一种方法可以确保这种情况发生? 我宁愿不冒险将内存中的敏感数据释放回操作系统……

未初始化的价值是否会带来安全风险?

在学习C的过程中,我犯了一些错误,并打印出未初始化的字符数组元素。 如果我将数组的大小扩展为相当大,比如说大小为100万个元素然后打印内容,那么出来的并不总是用户不可读,但似乎包含一些运行时信息。 请考虑以下代码: #include main() { char s[1000000]; int c, i; printf(“Enter input string:\n”); for (i = 0; ( c = getchar()) != ‘\n’; i++) { s[i] = c; } printf(“Contents of input string:\n”); for (i = 0; i < 999999; i++) { putchar(s[i]); } printf("\n"); return 0; } 只需滚动输出,我就会发现如下内容: ?? ?L’ ?????? _ dyldVersionNumber_dyldVersionString_dyld_all_image_infos_dyld_fatal_error_dyld_shared_cache_ranges_error_string__mh_dylinker_header_stub_binding_helper_dyld_func_lookup_offset_to_dyld_all_image_infos__dyld_start__ZN13dyldbootstrapL30randomizeExecutableLoadAddressEPK12macho_headerPPKcPm__ZN13dyldbootstrap5startEPK12macho_headeriPPKcl__ZN4dyldL17setNewProgramVarsERK11ProgramVars__ZN4dyld17getExecutablePathEv__ZN4dyld22mainExecutablePreboundEv__ZN4dyld14mainExecutableEv__ZN4dyld21findImageByMachHeaderEPK11mach_header__ZN4dyld26findImageContainingAddressEPKv […]

使用%* c清除scanf缓冲区的危险

在scanf()中使用%* c来清除缓冲区是否有任何危险。 例如: char c; for (int i = 0; i < 5; i++) { scanf("%c%*c", &c); } 要么 char* str; char c; int i; scanf(“%s”, str); scanf(“%d%*c”, &i); scanf(“%c%*c”, &c); 是否应该关注缓冲区溢出或其他安全问题? 似乎没有关于在scanf中使用星号的正式文档用于C( 编辑这不是真的),所以我很难找到输入的额外字符究竟发生了什么。 有没有更好的方法清除C中的scanf缓冲区?

是否有任何strcpy_s和/或TR24731-1的免费实现?

我有一个混合了C和C ++的旧项目。 它广泛使用C字符串以及strcpy , strcat , strncpy , strncat等。我发现了许多缓冲区溢出,我想使用更安全的函数,例如strcpy_s 。 MSVC包含这些function,但我需要能够在各种平台上运行的东西 – 至少是linux,osx和windows。 我知道strlcpy ,但是很多人都注意到( 例子 ),这确实不是一个改进。 那么:是否有strcpy_s , strcat_s等或整个TR24731-1免费实现? 我需要一些public domain或BSD ,但如果你知道其他许可证下的实现,请继续列出它们 – 我相信别人会受益。