首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

Android 渗透测试学习手册 第七章 不太知名的 Android 漏洞

第七章 不太知名的 Android 漏洞 作者:Aditya Gupta 译者:飞龙 协议:CC BY-NC-SA 4.0 在本章中,我们将了解一些不太知名的 Android 攻击向量,这在 Android 渗透测试中可能很有用。 我们还将涵盖一些主题,如 Android 广告库中的漏洞和WebView实现中的漏洞。 作为渗透测试者,本章将帮助你以更有效的方式审计 Android 应用程序,并发现一些不常见的缺陷。 7.1 Android WebView 漏洞 WebView是一种 Android 视图,用于在应用程序中显示 Web 内容。 它使用 WebKit 渲染引擎,以便使用file//和data//协议显示网页和其他内容,可以用于从文件系统加载文件和数据内容。WebView也用于各种 Android 应用程序,例如提供注册和登录功能的应用程序。它通过在应用程序的布局中构建其移动网站,来显示应用程序中的 Web 内容。 我们将在下一章中进一步讨论 WebKit 及其渲染引擎。 对于本章,我们将只关心使用 WebKit 的那些应用程序。 在应用中使用 WebView 在应用程序中使用WebView非常简单和直接。 假设我们希望我们的整个活动都是一个WebView组件,从http://examplewebsite.com加载内容。 下面是在 Android 应用程序中实现WebView的代码示例: WebView webview = new WebView(this); setContentView(webview); webview.loadUrl("http://vulnerable-website.com"); 另一个重要的事情是,大多数开发人员最终为了增强应用程序的功能,在WebView实现中使用以下命令启用 JavaScript(默认设置为False): setJavascriptEnabled(true); 前面的命令确保 JavaScript 可以在应用程序中执行,并利用注册界面。 识别漏洞 想象一下这种情况,应用程序在不安全的网络中使用,允许攻击者执行中间人攻击(更多中间人攻击的内容请参见 OWASP 网站https//www.owasp.org/index.php/Man-in-the-middle_attack)。 如果攻击者可以访问网络,则他们可以修改请求和对设备的响应。 这表示他们能够修改响应数据,并且如果从网站加载 JavaScript 内容,则可以完全控制 JavaScript 内容。 事实上,通过使用它,攻击者甚至可以使用 JavaScript 来调用手机上的某些方法,例如向另一个号码发送短信,拨打电话,甚至使用诸如 Drozer 之类的工具获取远程 shell。 让我们举个简单的例子,来说明WebView漏洞的可能性。 在这里,我们将使用 Joshua Drake 的 GitHub 仓库(https://github.com/jduck/VulnWebView/)中的,由他创建的概念证明。 这个 POC 在应用程序中使用WebView,来简单加载一个 URL 并且加载一个位于http://droidsec.org/addjsif.html的网页(如果这个链接打不开,你可以访问http//attify.com/lpfa/addjsif.html)。 以下是 Eclipse 中代码示例的屏幕截图,其中使用名称 Android 创建 JavaScript 界面: 我们还可以从源代码中创建apk文件,只需右键单击项目,然后选择Export as an Android Application(导出为 Android 应用程序)。 一旦我们运行应用程序并监听 Burp 代理中的流量,我们将看到应用程序中指定的 URL 的请求,如以下屏幕截图所示: 现在,当响应来自服务器时,我们可以修改响应数据并使用它来利用此漏洞,如以下屏幕所示 让我们假设攻击者需要利用这个漏洞应用程序,来使用受害者的设备向一个号码发送短信。 以下屏幕截图显示了修改后的响应的样子: 一旦我们点击Forward(转发)按钮,邮件将从受害者的设备发送到攻击者指定的号码。 上述内容简单地调用SMSManager(),以便将包含文本pwned的 SMS 发送到的预定义号码。 这是一个利用存在漏洞的WebView应用程序的简单示例。 事实上,你可以尝试调用不同的方法或使用 Drozer 从设备获取远程 shell。 你还可以访问https://labs.mwrinfosecurity.com/blog/2013/09/24/webview-addjavascriptinterface-remote-code-execution/阅读通过 Drozer 利用WebView的更多信息。 7.2 感染合法 APK 由于 Google 的不严格政策,将应用上传到 Play 商店时,许多开发人员上传了恶意应用和软件,目的是从使用者的装置窃取私人资料。 Google Play 中存在的大多数恶意软件只是合法应用程序的受感染版本。恶意软件作者只需要一个真正的应用程序,反编译它,插入自己的恶意组件,然后重新编译它,以便分发到应用商店和感染用户。这可能听起来很复杂,但实际上,这是一个非常简单的事情。 让我们尝试分析恶意软件作者如何修改合法应用程序,来创建它的受感染版本。执行此操作的最简单的方法之一是编写一个简单的恶意应用程序,并将其所有恶意活动放在服务中。此外,我们在AndroidManifest.xml文件中添加广播接收器,以便指定的事件(例如接收 SMS)能够触发我们的服务。 因此,以下是创建受感染版本的合法应用程序的简单步骤: 使用apktool解压缩应用程序,如下所示: apktool d [appname].apk 反编译恶意应用程序来生成 Java 类的 smali 文件。 在这里,我们需要将所有的恶意活动放在服务中。 此外,如果你有 smali 语言的经验,你可以直接从 smali 本身创建服务。 假设恶意服务的名称是malware.smali。 接下来,我们需要将malware.smali文件复制到 smali 文件夹,它位于我们反编译的合法应用程序的文件夹中 。 我们把malware.smali中的软件包名称的所有引用更改为合法应用程序的软件包名称,并在AndroidManifest.xml中注册服务。 在这里,我们需要在AndroidManifest.xml文件中添加另一行,如下所示: <service droid:name = "malware.java"/> 此外,我们需要注册一个广播接收器来触发服务。 在这种情况下,我们选择短信作为触发器,如下面的代码所示: <receiver android:name="com.legitimate.application.service"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> 使用apktool重新编译应用,像这样: apktool b appname/ 一旦应用程序使用apktool重新编译,新的 apk 将为被感染的合法版本。 向手机发送邮件可能会自动触发此恶意软件。 如果恶意软件服务需要的权限比合法应用程序更多,我们还需要手动在AndroidManifest.xml文件中添加缺少的权限。 7.3 广告库中的漏洞 Google Play上提供的大部分免费 Android 应用都会使用广告来赚取收益。 然而,通常广告库本身存在漏洞,使得整个应用程序容易受到某种严重的威胁。 为了识别特定应用程序中存在的广告库,我们可以使用dex2jar/apktool简单地反编译该应用程序,并分析创建的文件夹。 你还可以在http://www.appbrain.com/stats/libraries/ad中找到一些最受欢迎的 Android 广告库和使用它们的应用程序。 广告库可能具有许多漏洞,例如上一节中讨论的WebView漏洞,不安全的文件权限或任何其他漏洞,这可能会导致攻击者破坏整个应用程序,获得反向 shell 或甚至创建后门。 7.4 Android 中的跨应用脚本 跨应用程序脚本漏洞是一种 Android 应用程序漏洞,攻击者可以绕过同源策略并在应用程序位置中访问存储在 Android 文件系统上的敏感文件。 这意味着攻击者能够访问位于/data/data/[应用程序包名称]位置中的所有内容。 漏洞的根本原因是,应用程序允许内容使用受信任区域的访问权限,在不受信任区域中执行。 如果漏洞应用程序是 Web 浏览器,攻击会变得更加严重,其中攻击者能够静默窃取浏览器存储的所有 Cookie 和其他信息,并将其发送给攻击者。 甚至一些著名的应用程序,如 Skype,Dropbox,海豚浏览器等,早期版本中都存在跨应用程序脚本漏洞。 让我们来看看海豚浏览器 HD 中的漏洞,例如,由 Roee Hay 和 Yair Amit 发现的漏洞。 此示例中使用的存在漏洞的海豚浏览器 HD 应用程序版本为 6.0.0,以后的版本中修补了漏洞。 海豚浏览器 HD 有一个名为BrowserActivity的漏洞活动,它可以被其他应用程序以及其他参数调用。 攻击者可以使用它来调用海豚浏览器 HD 并打开特定的网页,以及恶意的 JavaScript。 以下屏幕截图显示了 POC 代码以及通报(http://packetstormsecurity.com/files/view/105258/dolphin-xas.txt): 这里,使用屏幕截图中的上述代码,我们将打开http://adityagupta.net网站以及 JavaScript 函数alert(document.domain),它将在提示框中简单地弹出域名。 一旦我们在我们的手机上打开这个恶意应用程序,它将调用海豚浏览器 HD,打开 URL 和我们指定的 JavaScript 代码,如下面的截图所示: 总结 在本章中,我们了解了 Android 中的不同攻击向量,从渗透测试者的角度来看,这非常有用。 本章应该用做对不同攻击向量的快速演练; 然而,建议你尝试这些攻击向量,尝试修改它们,并在现实生活中的渗透测试中使用它们。 在下一章中,我们将离开应用程序层,专注于 Android 平台的基于 ARM 的利用。

优秀的个人博客,低调大师

hbase 学习(十五)缓存机制以及可以利用SSD作为存储的BucketCache

下面介绍Hbase的缓存机制: a.HBase在读取时,会以Block为单位进行cache,用来提升读的性能 b.Block可以分类为DataBlock(默认大小64K,存储KV)、BloomBlock(默认大小128K,存储BloomFilter数据)、IndexBlock(默认大小128K,索引数据,用来加快Rowkey所在DataBlock的定位) c.对于一次随机读,Block的访问顺序为BloomBlock、IndexBlock、DataBlock,如果Region下面的StoreFile数目为2个,那么一次随机读至少访问2次BloomBlock+1次IndexBlock+1次DataBlock d.我们通常将BloomBlock和IndexBlock统称为MetaBlock,MetaBlock线上系统中基本命中率都是100% e.Block的cache命中率对HBase的读性能影响十分大,所以DataBlockEncoding将KV在内存中进行压缩,对于单行多列和Row相似的场景,可以提高内存使用率,增加读性能 f.HBase中管理缓存的Block的类为BlockCache,其实现目前主要是下面三种,下面将着重介绍这三类Cache 1、LruBlockCache 默认的BlockCache实现,也是目前使用的BlockCache,使用一个HashMap维护Block Key到Block的映射,采用严格的LRU算法来淘汰Block,初始化时会指定容量大小,当使用量达到85%的时候开始淘汰block至75%的比例。 优点:直接采用jvm提供的HashMap来管理Cache,简单可依赖;内存用多少占多少,JVM会帮你回收淘汰的BlOCK占用的内存 缺点: 1)一个Block从被缓存至被淘汰,基本就伴随着Heap中的位置从New区晋升到Old区 2)晋升在Old区的Block被淘汰后,最终由CMS进行垃圾回收,随之带来的是Heap碎片 3)因为碎片问题,随之而来的是GC时晋升失败的FullGC,我们的线上系统根据不同的业务特点,因为这个而发生FullGC的频率,有1天的,1周的,1月半年的都有。对于高频率的,在运维上通过在半夜手工触发FullGC来缓解 4)如果缓存的速度比淘汰的速度快,很不幸,现在的代码有OOM的风险(这个可以修改下代码避免) 2、SlabCache 针对LruBlockCache的碎片问题一种解决方案,使用堆外内存,处于实验性质,真实测试后,我们定位为不可用。说下它的原理:它由多个SingleSizeCache组成(所谓SingleSizeCache,就是只缓存固定大小的block,其内部维护一个ByteBuffer List,每个ByteBuffer的空间都是一样的,比如64K的SingleSizeCache,ByteBuffer的空间都是64K,cache Block时把Block的内容复制到ByteBuffer中,所以block的大小必须小于等于64K才能被这个SingleSizeCache缓存;淘汰block的时候只需要将相应的ByteBuffer标记为空闲,下次cache的时候对其上的内存直接进行覆盖就行了),cache Block的时候,选择一个小于且最接近的SingleSizeCache进行缓存,淘汰block亦此。由于SingleSize的局限性,其使用上和LruBlockCache搭配使用,叫做DoubleBlockCache,cache block的时候LruBlockCache和SlabCache都缓存一份,get block的时候顺序为LruBlockCache、SlabCache如果只有SlabCache命中,那么再将block缓存到LruBlockCache中(本人觉得它的这个设计很费,你觉得呢) 优点:其思想:申请固定内存空间,Block的读写都在这片区域中进行 缺点: 1)cache block和 get block的时候,需要内存复制 2)SingleSizeCache的设计,导致内存使用率很低 3)与LruBlockCache搭配使用不合理,导致所有的block都会去LruBlockCache中逗留一下,结果是CMS和碎片都不能有所改善 3、 BucketCache 可以看成是对SlabCache思想在实现上的一种改进及功能扩展,其优点是解决LruBlockCache的缺点及支持面向高性能读的大缓存空间,下面将着重介绍它的功效:3.1 何谓大缓存? 缓存Block的存储介质不再仅仅依赖在内存上,而是可以选择为Fusion-io、SSD等高速磁盘,我们称之为二级缓存。 3.2 何谓Bucket? 我们将缓存空间划分为一个个的Bucket,每个Bucket都贴上一个size标签,将Block缓存在最接近且小于size的bucket中(和SingleSizeCache很相似)。 3.3 怎么解决CMS 碎片问题? Block存储在Bucket中,而每个Bucket的物理存储是不变的,也就是说系统刚启动的时候,我们就申请了一堆Bucket内存空间,而这些内存空间是一直在Old区,block的Get/Cache动作只是对这片空间的访问/覆写,CMS/碎片自然大大减少。 3.4 怎么使用?BucketCache可以有两种用法 3.4.1 与LruBlockCache搭配,作为主要的内存cache方案使用 在hbase-site.xml中设置以下参数: – “hbase.bucketcache.ioengine” “heap” – “hbase.bucketcache.size” 0.4(bucket cache的大小, 0.4是最大对内存的比例) – 可选配置 • “hbase.bucketcache.combinedcache.percentage” 默认是0.9f (在CombinedCache中的比例) 3.4.2 作为二级缓存使用,将Block缓存在我们的高速盘(Fusion-IO)中 在hbase-site.xml中设置以下参数: – “hbase.bucketcache.ioengine” “file:/disk1/hbase/cache.data”(存储block数据的路径) – “hbase.bucketcache.size” 10*1024 (bucket cache的大小, 单位是MB, 10*1024 是10GB) – “hbase.bucketcache.combinedcache “ false – 可选配置 • “hbase.bucketcache.persistent.path” “file:/disk1/hbase/cache.meta”(存储bucket cache的元数据的路径, 用于启动的时候恢复cache) 3.5.BucketCache中的Cache/Get Block逻辑? 简单地描述下:CacheBlock的时候,将Block放在一个RAMMap和一个Queue中,然后WriterThread异步从Queue中remove Block写入到IOEngine(内存或高速盘)中,并将BlockKey及其位置、长度等信息记录在backingMapGetBlock的时候,先访问RAMMap,然后访问backingMap获取block的位置及长度,从IOEngine读取数据 3.6.Block在IOEngine中的位置是怎么分配的? 我们将物理空间划分为一堆等大的Bucket,每一个Bucket有一个序号及一个size标签,于是Block所在bucket的序号及其在bucket中的offset与block在物理空间的offset就形成了一一对应。我们通过BucketAllocator为指定大小的Block寻找一个Bucket进行存放,于是就得到了其在物理空间上的位置。 上图描述了BucketAllocator对于Bucket的组织管理: 1) 每个Bucket都有一个size标签,目前对于size的分类,是在启动时候就确定了,如默认的有(8+1)K、(16+1)K、(32+1)K、(40+1)K、(48+1)K、(56+1)K、(64+1)K、(96+1)K ... (512+1)K 2) 相同size标签的Bucket由同一个BucketSizeInfo管理 3) Bucket的size标签可以动态调整,比如64K的block数目比较多,65K的bucket被用完了以后,其他size标签的完全空闲的bucket可以转换成为65K的bucket,但是至少保留一个该size的bucket 4)如果最大size的bucket为513K,那么超过这个大小的block无法存储,直接拒绝 5)如果某个size的bucket用完了,那么会依照LRU算法触发block淘汰 问题: 如果系统一开始都是某个size的block,突然变成另外个size的block(不能存在同个size的bucket中)会发生什么,是否还会不停地进行淘汰算法? 是的,但是由于淘汰是异步的,影响不大,而且随着淘汰进行,bucket的大小会逐渐向那个block size大小bucket转移,最终稳定 3.7 BucketAllocator中allocate block的流程? 3.8 BucketAllocator中free block的流程? 3.9 第一种使用的测试结果 3.10 第二种使用的测试结果

优秀的个人博客,低调大师

Solon AI 开发学习 7 - chat - 四种消息类型及提示语增强

大模型接收的是“提示语”(或提示词),返回的是“生成内容”。提示语,则有一条或多条不同类型的消息组成(可以有会话历史消息)。 1、四种消息类型结构 UserMessage 用户消息 由用户输入的消息 属性 描述 metadata:Map 元数据(用于扩展输出) content:String 内容 medias:List<AiMedia> 图片集合(可以是 url 或 base64) ChatMessage.ofUser("你好!"); //需要多模态模型支持 ChatMessage.ofUser("这图里有方块吗?", Image.ofUrl("http://../demo.jpg")); ChatMessage.ofUser(Image.ofUrl("http://../demo.jpg")); ChatMessage.ofUser("这图里有方块吗?"); SystemMessage 系统消息(现在的模型,一般用不到了) 系统消息,主要是为当前会话设定AI的角色属性。一般作为一个会放的头条消息 属性 描述 metadata:Map 元数据(用于扩展输出) content:String 内容 ChatMessage.ofSystem("你是个建筑工地的工人,对搬砖很有经验!"); 应用示例: List<ChatMessage> messages = new ArrayList(); messages.add(ChatMessage.ofSystem("你是个建筑工地的工人,对搬砖很有经验!")); messages.add(ChatMessage.ofUser("100块砖,搬到10楼大概要多久?")); chatModel.prompt(messages); //context 可以是描述天气的任何对象 .call(); AssistantMessage 助理消息 由大语言模型生成的消息 属性 描述 metadata:Map 元数据(用于扩展输出) content:String 内容(当内容为空时,表示为思考状态) toolCalls:List<ToolCall> 工具调用 ToolMessage 工具消息 由框架根据 AssistantMessage 描述的本地工具调用(Tool call)生成的消息。 属性 描述 metadata:Map 元数据(用于扩展输出) content:String 内容 name:String 函数名 toolCallId:String 工具调用标识 returnDirect:boot 是否直接返回 2、用户消息的构建方式 基本消息 chatModel.prompt(ChatMessage.ofUser("hello")) .call(); 消息增强(格式化上下文) String message = "今天天气好吗?"; chatModel.prompt(ChatMessage.ofUserAugment(message, context)) //context 可以是描述天气的任何对象 .call(); 消息增强(定制格式模板) String message = "今天天气好吗?"; chatModel.prompt(ChatMessage.ofUserTmpl("#{query} \n\n 请参考以下内容回答:#{context}") .paramAdd("query", message) .paramAdd("context", context) .generate()) .call(); 3、关于用户消息的“消息增强” 将用户输入的消息通过格式化,附加相关的上下文(或参考资料),从而实现“消息增强”。这也是构成 RAG技术(检索增强生成,结合信息检索和语言模型)的纽带。 快捷增强(固定模板,让消息有时间和参考上下文) //ChatMessage.ofUserAugment(String message, Object context); //示例1: ChatMessage.ofUserAugment("a+b 等于几?", "假如 a=1, b=2"); //示例2: let message = "刘德华今年有哪些演唱会?" let context = ticketRepository.search(message); ChatMessage.ofUserAugment(message, context); 模板增强(基于模板定制消息格式) let message = "刘德华今年有哪些演唱会?" let context = ticketRepository.search(message); ChatMessage.ofUserTmpl("#{message} \n\n #参考资料:#{context} \n\n #要求:如果参考资料里没有,返回没有") .paramAdd("message", message) .paramAdd("context", context) .generate(); 4、多角色混合提示增强 可组合 SystemMessage、UserMessage 和 AssistantMessage 实现多轮对话。达到场景效果。 List<ChatMessage> prompt = List.of( ChatMessage.ofSystem("你是一个天气预报助手,只回答天气相关问题。"), ChatMessage.ofUser("今天北京天气如何?"), ChatMessage.ofAssistant("北京今天晴,气温20-25℃。"), ChatMessage.ofUser("需要带伞吗?") ); chatModel.prompt(prompt); .call();

优秀的个人博客,低调大师

软件所提出基于信息论的大模型强化学习微调框架

中国科学院软件研究所天基综合信息系统全国重点实验室研究团队聚焦大语言模型(LLMs)在复杂推理任务中的优化问题,提出了一种基于信息论的强化微调框架Learning to Think (L2T),旨在平衡模型的推理效果和效率,为大语言模型在实际应用中的推理优化提供新的技术路径。 近日,相关成果论文Learning to Think: Information-Theoretic Reinforcement Fine-Tuning for LLMs在人工智能领域顶级会议NeurIPS 2025上发表,第一作者为博士生王婧瑶、副研究员强文文、博士生宋泽恩。 随着LLMs能力的不断提升,其应用场景已从基础自然语言处理任务扩展到需要多步逻辑推理的复杂问题。研究团队分析发现,对于复杂推理任务,现有LLMs大多依赖推理计算的最终结果作为奖励信号,缺乏对中间推理步骤的及时反馈,这会导致模型产生冗余计算,造成资源浪费,甚至可能降低推理效果。 针对上述问题,L2T框架首先进行了问题重构,将推理过程建模为多回合层次化对话,同时引入一种基于信息论的稠密过程奖励机制。该机制通过评估每一推理回合带来的信息增益,并采用改进的GRPO算法策略对大语言模型进行优化,鼓励有理推理步骤、抑制冗余生成,从而实现对推理路径的精细化调控,提升推理质量和效率。 通过AIME、AMC和HumanEval等推理基准测试,L2T在不同规模的基础模型(包括DeepScaleR-1.5B-Preview、DeepSeek-R1-Distill-Qwen-1.5B等)上均表现出稳定的性能提升。结果显示,与基于结果奖励的方法相比,L2T在准确率上提升超过3.2%,同时token效率翻倍;与基于过程奖励的基线相比,L2T 在准确率上仍有约2%的提升,效率提升约1.2倍。此外,在多任务评估中,L2T在不同难度任务上实现了平均近3%的确率提升,并在不同token预算下均保持稳定的性能优势。

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册