首页
社区
课程
招聘
[讨论][分享]关于最近很火的安卓stagefright漏洞
发表于: 2015-7-29 12:41 5303

[讨论][分享]关于最近很火的安卓stagefright漏洞

2015-7-29 12:41
5303

新人貌似只能在这里发帖,
求转正
求漏洞的poc
求讨论出poc
本人菜鸟,求指正
这个漏洞被归属于
CVE-2015-1538  
CVE-2015-1539 
CVE-2015-3824 
CVE-2015-3826 
CVE-2015-3827  
CVE-2015-3828 
CVE-2015-3829 
参考网站:
1.http://blog.zimperium.com/experts-found-a-unicorn-in-the-heart-of-android/(可能需要科学上网,发现这个漏洞的作者的blog)
2.https://threatpost.com/android-stagefright-flaws-put-950-million-devices-at-risk/113960(这个也是新闻报道)
3.http://www.freebuf.com/news/73411.html(这个是新闻报道)
4.http://www.freebuf.com/articles/terminal/73517.html (这个里面有一点信息)
伪详情:
出问题代码在media/libstagefright/MPEG4Extractor.cpp,media/libstagefright/SampleTable.cpp,
media/libstagefright/ESDS.cpp
其中修复最多的为MPEG4Extractor.cpp 共7处
SampleTable.cpp,4处
ESDS.cpp,3处
附件会提供这些文件及其相关的头文件(修复前和修复后),希望尽可能快的讨论出来一个利用方法,最好是在8月份之前。:)举其中一个例子,参考网站4里面有一些这些例子之外的其他例子,也可以使用diff工具进行对比。这次已知的漏洞一共三种类型,越界读取漏洞,整数下溢漏洞,整数溢出漏洞。其中SampleTable.cpp中修复了一个高危级别的整数溢出漏洞。
下面举一个,越界读取漏洞:MPEG4Extractor.cpp(这个漏洞的部分修复,不完全)
====我割====修复前====
status_t MPEG4Extractor::parse3GPPMetaData(off64_t offset, size_t size, int depth) {
  /*注意考虑size*/
  if (size < 4 ) {
        return ERROR_MALFORMED;
    }
  /*注意*/
    uint8_t *buffer = new (std::nothrow) uint8_t[size];
    if (buffer == NULL) {
        return ERROR_MALFORMED;
    }
    if (mDataSource->readAt(
                offset, buffer, size) != (ssize_t)size) {
        delete[] buffer;
        buffer = NULL;

        return ERROR_IO;
    }
====再割====修复后====
status_t MPEG4Extractor::parse3GPPMetaData(off64_t offset, size_t size, int depth) {
    /*注意*/
  if (size < 4 || size == SIZE_MAX) {
        return ERROR_MALFORMED;
    }
  /*注意*/
    uint8_t *buffer = new (std::nothrow) uint8_t[size + 1];
    if (buffer == NULL) {
        return ERROR_MALFORMED;
    }
    if (mDataSource->readAt(
                offset, buffer, size) != (ssize_t)size) {
        delete[] buffer;
        buffer = NULL;

        return ERROR_IO;
    }
====分析====个人理解,望不吝指教====
parse3GPPMetaData这个函数如果不是以NUL结尾的话,
if (buffer[size - 1] != '\0') {
              char tmp[4];
              sprintf(tmp, "%u", buffer[size - 1]);

              mFileMetaData->setCString(kKeyCDTrackNumber, tmp);

setCString不知道哪里结束,就会发生越界读取。
========
详情见附件 说明.txt
附件:http://pan.baidu.com/share/link?shareid=1722093243&uk=1460778035


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 3
支持
分享
最新回复 (9)
雪    币: 359
活跃值: (114)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
请看一楼
2015-7-29 12:45
0
雪    币: 359
活跃值: (114)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
2.https://threatpost.com/android-stagefright-flaws-put-950-million-devices-at-risk/113960(这个也是新闻报道)
3.http://www.freebuf.com/news/73411.html(这个是新闻报道)
4.http://www.freebuf.com/articles/terminal/73517.html (这个里面有一点信息)
伪详情:
出问题代码在media/libstagefright/MPEG4Extractor.cpp,media/libstagefright/SampleTable.cpp,
media/libstagefright/ESDS.cpp
其中修复最多的为MPEG4Extractor.cpp 共7处
SampleTable.cpp,4处
ESDS.cpp,3处
附件会提供这些文件及其相关的头文件(修复前和修复后),希望尽可能快的讨论出来一个利用方法,最好是在8月份之前。:)举其中一个例子,参考网站4里面有一些这些例子之外的其他例子,也可以使用diff工具进行对比。这次已知的漏洞一共三种类型,越界读取漏洞,整数下溢漏洞,整数溢出漏洞。其中SampleTable.cpp中修复了一个高危级别的整数溢出漏洞。
下面举一个,越界读取漏洞:MPEG4Extractor.cpp(这个漏洞的部分修复,不完全)
====我割====修复前====
status_t MPEG4Extractor::parse3GPPMetaData(off64_t offset, size_t size, int depth) {
  /*注意考虑size*/
  if (size < 4 ) {
        return ERROR_MALFORMED;
    }
  /*注意*/
    uint8_t *buffer = new (std::nothrow) uint8_t[size];
    if (buffer == NULL) {
        return ERROR_MALFORMED;
    }
    if (mDataSource->readAt(
                offset, buffer, size) != (ssize_t)size) {
        delete[] buffer;
        buffer = NULL;

        return ERROR_IO;
    }
====再割====修复后====
status_t MPEG4Extractor::parse3GPPMetaData(off64_t offset, size_t size, int depth) {
    /*注意*/
  if (size < 4 || size == SIZE_MAX) {
        return ERROR_MALFORMED;
    }
  /*注意*/
    uint8_t *buffer = new (std::nothrow) uint8_t[size + 1];
    if (buffer == NULL) {
        return ERROR_MALFORMED;
    }
    if (mDataSource->readAt(
                offset, buffer, size) != (ssize_t)size) {
        delete[] buffer;
        buffer = NULL;

        return ERROR_IO;
    }
====分析====个人理解,望不吝指教====
parse3GPPMetaData这个函数如果不是以NUL结尾的话,
if (buffer[size - 1] != '\0') {
              char tmp[4];
              sprintf(tmp, "%u", buffer[size - 1]);

              mFileMetaData->setCString(kKeyCDTrackNumber, tmp);

setCString不知道哪里结束,就会发生越界读取。
========
详情见附件 说明.txt
附件:http://pan.baidu.com/share/link?shareid=1722093243&uk=1460778035
2015-7-29 12:55
0
雪    币: 359
活跃值: (114)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
3.http://www.freebuf.com/news/73411.html(这个是新闻报道)
4.http://www.freebuf.com/articles/terminal/73517.html (这个里面有一点信息)
伪详情:
出问题代码在media/libstagefright/MPEG4Extractor.cpp,media/libstagefright/SampleTable.cpp,
media/libstagefright/ESDS.cpp
其中修复最多的为MPEG4Extractor.cpp 共7处
SampleTable.cpp,4处
ESDS.cpp,3处
附件会提供这些文件及其相关的头文件(修复前和修复后),希望尽可能快的讨论出来一个利用方法,最好是在8月份之前。:)举其中一个例子,参考网站4里面有一些这些例子之外的其他例子,也可以使用diff工具进行对比。这次已知的漏洞一共三种类型,越界读取漏洞,整数下溢漏洞,整数溢出漏洞。其中SampleTable.cpp中修复了一个高危级别的整数溢出漏洞。
下面举一个,越界读取漏洞:MPEG4Extractor.cpp(这个漏洞的部分修复,不完全)
====我割====修复前====
status_t MPEG4Extractor::parse3GPPMetaData(off64_t offset, size_t size, int depth) {
  /*注意考虑size*/
  if (size < 4 ) {
        return ERROR_MALFORMED;
    }
  /*注意*/
    uint8_t *buffer = new (std::nothrow) uint8_t[size];
    if (buffer == NULL) {
        return ERROR_MALFORMED;
    }
    if (mDataSource->readAt(
                offset, buffer, size) != (ssize_t)size) {
        delete[] buffer;
        buffer = NULL;

        return ERROR_IO;
    }
====再割====修复后====
status_t MPEG4Extractor::parse3GPPMetaData(off64_t offset, size_t size, int depth) {
    /*注意*/
  if (size < 4 || size == SIZE_MAX) {
        return ERROR_MALFORMED;
    }
  /*注意*/
    uint8_t *buffer = new (std::nothrow) uint8_t[size + 1];
    if (buffer == NULL) {
        return ERROR_MALFORMED;
    }
    if (mDataSource->readAt(
                offset, buffer, size) != (ssize_t)size) {
        delete[] buffer;
        buffer = NULL;

        return ERROR_IO;
    }
====分析====个人理解,望不吝指教====
parse3GPPMetaData这个函数如果不是以NUL结尾的话,
if (buffer[size - 1] != '\0') {
              char tmp[4];
              sprintf(tmp, "%u", buffer[size - 1]);

              mFileMetaData->setCString(kKeyCDTrackNumber, tmp);

setCString不知道哪里结束,就会发生越界读取。
========
详情见附件 说明.txt
附件:http://pan.baidu.com/share/link?shareid=1722093243&uk=1460778035
2015-7-29 12:57
0
雪    币: 359
活跃值: (114)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
好吧,http://bbs.pediy.com/showthread.php?p=1384263#post1384263
2015-8-1 07:42
0
雪    币: 107
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
为什么精华帖没人回复???????

谢谢楼主分享...
2015-8-4 21:13
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
前来冒泡
2015-8-4 23:41
0
雪    币: 250
活跃值: (65)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
感谢分享
2015-8-5 09:08
0
雪    币: 1016
活跃值: (191)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢楼主分享 虽然不知是做啥的
2015-8-6 09:13
0
雪    币: 43
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
因为漏洞,收到短信的同时就中招,被控
2015-8-7 08:49
0
游客
登录 | 注册 方可回帖
返回
//