使用Android NDK演示printf或__android_log_print漏洞

时间:2019-03-28 04:51:32

标签: android c++ c android-ndk printf

我有兴趣通过NDK应用程序演示printf漏洞。需要明确的是,我知道要登录控制台,我们可以使用__android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "Print : %d %s",someVal, someStr);。我已经尝试过了,而且我知道它可行。但我明确希望演示printf()的漏洞,特别是要使用%n说明符来写到指向的位置。

是否有一种方法可以使printf()发挥作用,还是可以通过__android_log_print()来实现?我尝试使用android/log.h标头,但没有成功。

我可以通过运行printf(%s%s%s%s%s%s%s%s%s%s)来使应用程序崩溃。但是同样,我不能操纵指针。

出于一般知识的目的,为什么printf()首先不起作用?__android_log_print()如何防止这些攻击?

2 个答案:

答案 0 :(得分:3)

您确实意识到Android是开源的。

从寻找__android_log_print()开始 并找到它:https://android.googlesource.com/platform/system/core/+/refs/heads/master/liblog/logger_write.cpp

int __android_log_print(int prio, const char* tag, const char* fmt, ...) {
  va_list ap;
  char buf[LOG_BUF_SIZE];
  va_start(ap, fmt);
  vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
  va_end(ap);
  return __android_log_write(prio, tag, buf);
}

我最终看到了:https://android.googlesource.com/platform/bionic/+/refs/heads/master/libc/stdio/vfprintf.cpp

第453-454行:

  case 'n':
    __fortify_fatal("%%n not allowed on Android");

代码中还引用了FORTIFY的附加安全性,如以下博客文章所述:

https://android-developers.googleblog.com/2017/04/fortify-in-android.html

答案 1 :(得分:0)

Android特别不支持%n格式说明符,因为它们很容易受到攻击。

https://android.googlesource.com/platform/bionic/+/400b073ee38ecc2a38234261b221e3a7afc0498e/tests/stdio_test.cpp#328