欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

安卓Message APP拒绝服务ddos漏洞破绽bug(CVE-2017-0780)运用与研究

来源:本站整理 作者:佚名 时间:2017-09-18 TAG: 我要投稿

0×01 破绽漏洞bug简介
9月7号 趋向科技宣布了一篇《CVE-2017-0780: 回绝办事破绽漏洞bug能够招致Android Message App 瓦解》的文章。今朝曾经确认该破绽漏洞bug对最新版本的Nexus 和 Pixel 装备有影响,入侵攻击者能够经由过程发送黑客恶意彩信到受害人手机完成入侵攻击。许多彩信客户端会在启动的时刻主动规复加载以前的记载,包含彩信,这招致受害人无论是重启手机照样进入网安形式都无奈消除黑客恶意彩信对Message app的影响,主动成为一个可连续的破绽漏洞bug。 该破绽漏洞bug今朝针对 Android 6.0 — 8.0 版本均有影响。
破绽漏洞bug代码在AOSP 第三方扩大模块 framesequence 的FrameSequenceDrawable类的acquireAndValidateBitmap 函数。在函数内由于没有捕捉 Java-level Null Pointer Exceptions 异常,从而会招致此异常沿着挪用栈不停向上回溯直到被捕捉处置,假如在APP外部也没有处置,终极会被体系处置,平日体系会让APP Crash。
0×02 破绽漏洞bug阐发
public FrameSequenceDrawable(FrameSequence frameSequence, BitmapProvider bitmapProvider) {
    if (frameSequence == null || bitmapProvider == null) throw new IllegalArgumentException();
 
    mFrameSequence = frameSequence;
    mFrameSequenceState = frameSequence.createState();
    final int width = frameSequence.getWidth();
    final int height = frameSequence.getHeight();
 
    mBitmapProvider = bitmapProvider;
    mFrontBitmap = acquireAndValidateBitmap(bitmapProvider, width, height);
    mBackBitmap = acquireAndValidateBitmap(bitmapProvider, width, height);
    mSrcRect = new Rect(0, 0, width, height);
    mPaint = new Paint();
    mPaint.setFilterBitmap(true);
 
    mFrontBitmapShader
        = new BitmapShader(mFrontBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
    mBackBitmapShader
        = new BitmapShader(mBackBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
 
    mLastSwap = 0;
 
    mNextFrameToDecode = -1;
    mFrameSequenceState.getFrame(0, mFrontBitmap, -1);
    initializeDecodingThread();
}
Android 应用FrameSequenceDrawable 类来展现gif 文件,首先要基于GIF 文件结构Bitmap工具,而后FrameSequenceDrawable 类展现GIF。
FrameSequenceDrawable 结构函数中会挪用 acquireAndValidateBitmap 创立 Bitmap工具。
private static Bitmap acquireAndValidateBitmap(BitmapProvider bitmapProvider,
        int minWidth, int minHeight) {
    Bitmap bitmap = bitmapProvider.acquireBitmap(minWidth, minHeight);   // 完成在应用中,能够前往 null
 
    if (bitmap.getWidth()
            || bitmap.getHeight()
            || bitmap.getConfig() != Bitmap.Config.ARGB_8888) {
        throw new IllegalArgumentException("Invalid bitmap provided");
    }
 
    return bitmap;
}
上面这个 class 能够在任何 APP 中自定义。
private class CheckingProvider implements FrameSequenceDrawable.BitmapProvider {
       
       HashSet mBitmaps = new HashSet();
       @Override
       
       public Bitmap acquireBitmap(int minWidth, int minHeight) {
           Bitmap bitmap =
                   Bitmap.createBitmap(minWidth + 1, minHeight + 4, Bitmap.Config.ARGB_8888);
           mBitmaps.add(bitmap);
           return bitmap;
       }
}
 
bitmapProvider 是FrameSequenceDrawable.BitmapProvider 的子类工具,Sample 代码中中完成一个 class, 重写 BitmapProvider 的形象函数 acquireBitmap。
结构POC 能够 间接在 此函数中前往null, 由于在 acquireAndValidateBitmap 中没有检测 bitmap 工具能否为null ,并且此函数也没有 catch 空指针异常,终极在挪用 bitmap 工具时 会招致 应用此模块(android-common-framesequence)的下层应用 crash。
当FrameSequence测验考试从格局不正确的GIF构建位图时,咱们看到“acquireBitmap”函数能够会失败并前往null。 是以,假如有变量引用此空工具,则会触发NPE。
0×03 结构Exploit
exp-1:
经由过程结构特别的gif 文件验证破绽漏洞bug。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载