来自 防护 2021-10-11 15:11 的文章

网站安全防护_ddos防护服务_解决方案

网站安全防护_ddos防护服务_解决方案

webview在Android应用程序上非常常见。有明确的WebView安全性最佳实践,ddos攻击防御有哪些有效方式,但它们是否正在实施?考虑到我们之前的博客文章androidwebview:securecodingpractices,ddos攻击原理和防御书,我们想了解WebViews中的安全最佳实践是如何在野外实现的。目前在互联网上提供的带有WebViews的应用程序是否安全?寻找有影响力项目的方法我们的安全研究团队进行了一次GitHub搜索,以获得使用WebView的项目列表,防御ddos吗,这些项目被认为是最具影响力的。为了找到最有影响力的项目,我们使用这个公式创建了一个得分=0.7*stars+0.3*forks的分数,结果得到了一组142个实现WebViews的流行应用程序,这些应用程序可能存在漏洞。接下来,我们仔细分析了这组应用程序。以下是我们的结论。挖掘:使用Android WebView的项目我们从分析加密问题开始。此图显示了通信中缺少HTTPS的结果:超过一半的应用程序并没有在所有通信中强制使用HTTPS。不使用HTTPS的常见借口包括对性能的影响以及不需要保护的非敏感信息。然而,传奇cc攻击防御,这些都不再是有效的理由。一个很好的例子是Checkmarx研究小组最近为Tinder披露的漏洞,它损害了用户的机密性。这些漏洞是由于缺少SSL/TLS造成的。现在,HTTPS应该在所有的通信中强制执行。注意SSL/TLS错误忽略SSL/TLS错误是另一种常见的错误做法。当发生HTTPS通信时,会发生安全通信的协商,并且可能会发生错误。例如,当攻击者对HTTPS连接发起中间人(MitM)攻击时,SSL/TLS协商会导致错误,因为可识别的授权机构没有签署服务器的证书。WebView的默认行为是阻止加载导致SSL/TLS错误的内容。但是,可以对应用程序进行编程以绕过这些错误。下图显示忽略SSL/TLS错误的项目百分比:在分析的应用程序中,只有8%具有以自定义方式处理SSL/TLS错误的代码。总的来说,3%的应用程序忽略了HTTPS错误,这使得它们容易受到MitM攻击。作为一个示例,下面是从分析的应用程序中提取的易受攻击的代码。应用程序不应忽略SSL/TLS错误。@重写public void onReceiveDslerRor(WebView视图,SslErrorHandler处理程序,SslError错误){处理程序。继续();}@覆盖public void onReceiveDslerRor(WebView视图,SslErrorHandler处理程序,SslError错误){处理程序。继续();}@覆盖public void onReceiveDslerRor(WebView视图,SslErrorHandler处理程序,SslError错误){处理程序();}正在验证内容加载安全性分析的下一个最佳实践是在加载内容后验证加密。Android WebViews可以验证加载的内容是否是应用程序正常行为中的异常内容,或者是否以某种方式被操纵。下一个图表显示了易受操纵内容加载影响的应用程序的结果。在4%的应用程序中,根据从加载页面读取的参数将内容加载到WebView上。这些参数可能被操纵,并导致WebView加载恶意代码。若要验证在WebView中加载的URL,应重写ShouldOverrideAllLoading或shouldInterceptRequest方法。除了验证加载的url之外,还应该始终验证参数。下面的示例显示了提取的不安全代码段,其中输入验证应该到位。private void loadArticle(@NonNull final hackernewitem item){mWebView=new CacheableWebView(mContext);mWebView.setWebViewClient(新的AdBlockWebViewClient(Preferences.adBlockEnabled(首选项.adBlockEnabled)(mContext)));mWebView.setWebChromeClient(新的可缓存WebView.ArchiveClient(){@重写public void onProgressChanged(WebView视图,int newProgress){super.onProgressChanged公司notify,new};项目进度;notify new};mWebView.loadUrl(项目.获取URL()); }private void loadArticle(@NonNull final HackerNewsItem项){mWebView=新的可缓存WebView(mContext);mWebView.setWebViewClient(新的AdBlockWebViewClient(Preferences.adBlockEnabled(首选项.adBlockEnabled)(mContext)));mWebView.setWebChromeClient(新的可缓存WebView.ArchiveClient() {@覆盖public void onProgressChanged(WebView视图,网站cc防御工具,int newProgress){super.onProgressChanged公司(视图,新进展);通知文章(newProgress);}});通知物品(0);mWebView.loadUrl(项目.获取URL());}private void loadArticle(@NonNull final HackerNewsItem项){mWebView=新的可缓存WebView(mContext);mWebView.setWebViewClient(新的AdBlockWebViewClient(Preferences.adBlockEnabled(首选项.adBlockEnabled)(mContext)));mWebView.setWebChromeClient(新的可缓存WebView.ArchiveClient() {@覆盖public void onProgressChanged(WebView视图,int newProgress){super.onProgressChanged公司(视图,新进展);通知文章(newProgress);}});第0条(通知);mWebView.loadUrl(项目.获取URL());}前面的代码用以下方式调用:如果(mJob.article启用&& item.IsStoreyType() && !TextUtils.isEmpty文本实用程序(项目.获取URL()){如果(Looper.myLooper() == Looper.getMainLooper(){loadArticle(item);(…)如果(mJob.article启用&& item.IsStoreyType() && !TextUtils.isEmpty文本实用程序(项目.获取URL())) {如果(Looper.myLooper() == Looper.getMainLooper()) {装载物品(项);(…)如果(mJob.article启用&& item.IsStoreyType() && !TextUtils.isEmpty文本实用程序(项目.获取URL())) {如果(Looper.myLooper() == Looper.getMainLooper()) {装载物品(项);( … )"item"参数未被验证,shouldOverrideUrlLoading/shouldInterceptRequest方法不会被重写以验证加载的URL。WebViews中JavaScript的安全性?关于JavaScript在WebViews中的使用,我们不能说它是不安全的。然而,这无疑增加了不安全编码的可能性,这就是WebViews默认禁用Javascript的原因。我们发现在58%的分析应用程序中启用了JavaScript:虽然这本身并不是一个坏的实践,但我们认为这是一个值得强调的有趣发现。在WebViews中使用JavascriptInterfaces另一个类似的开发选项是使用JavascriptInterfaces。这些允许WebView使用应用程序代码中存在的本机Java函数。我们的团队对易受攻击的代码进行了分析,下图显示了结果:尽管我们发现20%的被分析应用程序实现了JavaScriptInterface,但只有4%的应用程序被认为是不安全的。不安全的JavascriptInterface允许攻击者通过XSS和MitM攻击访问移动设备功能和本地资源。它们应该受到输入验证和安全业务逻辑的保护。我们从一个分析过的应用程序中提取了以下代码片段以演示该漏洞:@JavascriptInterface public void openNativeCamera(){Intent Intent=新意图(MediaStore.ACTION_图像捕获); mFragment.startActivityForResult(intent,G.ACTION_CAMERA);}@JavascriptInterface public void sendMessage(字符串类型,字符串电话号码,字符串消息){if("1".equals(type)){String SENT_SMS_ACTION="已发送的SMS_ACTION";Intent sentinent=新的意向(已发送的\u SMS_ACTION);pendingtinent sentPI=pendingtent.getBroadcast(mContext,0,sentinent,0);smsmmanager smsmsmanager=SmsManager.getDefault(); smsManager.sendTextMessage(电话号码,空,消息,sentPI,null);}else if("2".equals(type)){Uri=Uri.parse("smsto:"+phoneNumber);Intent sendtintent=新意向(Intent.ACTION\u视图,uri);发送意图.putExtra("短信正文",消息);mContext.startActivity公司(发送意图);}}@JavascriptInterface public void openRecorder(){Intent Intent=新意图(Intent.ACTION\u GET_内容); intent.setType("音频/amr");intent.setClassName("com.android.soundrecorder公司", "com.android.soundrecorder公司.录音机");mFragment.startActivityForResult(意向,G.动作记录仪);}@JavascriptInterface接口public void openNativeCamera(){Intent Intent=新意图(MediaStore.ACTION_图像捕获);mFragment.startActivityForResult(意向,G.动作镜头);}@JavascriptInterface接口public void sendMessage(字符串类型,字符串电话号码,字符串消息){if("1"。等于(类型)){String SENT_SMS_ACTION="发送的短信动作";Intent sentIntent=新的意向(发送短信动作);悬垂量sentPI=pendingtent.getBroadcast(mContext,0,sentinent,0);经理=smanagerSmsManager.getDefault();smsManager.sendTextMessage(电话号码,null,消息,sentPI,null);}else类型(如果等于".2"){Uri Uri=Uri.parse("smsto:"+电话号码);Intent sendtintent=新意图(Intent.ACTION\u视图,uri);发送意图.putExtra("短信正文",消息);mContext.startActivity公司(发送意图);}}@JavascriptInterface接口public void openRecorder(){Intent Intent=新意图(Intent.ACTION\u GET_内容);intent.setType("音频/amr");intent.setClassName("com.android.soundrecorder公司", "com.android.soundrecorder公司.录音机");mFragment.startActivityForResult(意向,G.动作记录仪);}@JavascriptInterface接口