前言

随着开源软件热潮的进一步发展和在互联网上的广泛应用,目前因开源软件存在漏洞而造成的影响变得巨大。如Bash漏洞、Openssl心脏出血漏洞、ImageMagick命令执行漏洞、ffmpeg文件读取漏洞等等。此类软件漏洞往往没能及时修复,主要有以下原因:

1.因为此类漏洞已影响线上业务运行,而往往容易被系统运维管理者忽视;

2.不太清楚线上业务的依赖环境,所以也不敢随意更新软件包版本;

3.软件维护者已经发布更新了软件包,但是系统运维管理者没能及时获悉。

那么,作为一个企业线上业务的运维管理或者安全管理者,应该如何有效地更新系统软件包版本呢?笔者作为一名乙方网络安全产品的开发者,以HIDS中的软件包版本模块为例,简单讲讲,主机安全检测系统是如何检测存在漏洞的软件包版本的。

一、包版本比对的方法

常见的Linux环境下的软件包版本管理有apt(Debian系)和yum(Redhat系)等,其中apt在Debian系Linux系统上管理的.deb包,yum管理的是.rpm软件包。以笔者的centos系统为例,通过如下命令可以获取到目前系统中存在的软件包版本:

Shell

rpm -qa --qf '%{NAME}|%{VERSION}|%{RELEASE}|%{INSTALLTIME}|%{SIGPGP:pgpsig}\n'

1

rpm-qa--qf'%{NAME}|%{VERSION}|%{RELEASE}|%{INSTALLTIME}|%{SIGPGP:pgpsig}\n'

获取到的部分软件列表如下:

可以很容易找到当前系统中软件对于到版本号。那么,该如何利用这些版本号找出可能存在漏洞到软件包呢?以Redhat为例,Redhat官方提供了基于软件包检测漏洞的一整套检测体系:OVAL标准。简单来说,其检测方法就是基于OVAL定义的标准进行软件版版本匹配,低于最新版本的包则可能存在漏洞。

关于什么是OVAL可以其官方网站:http://oval.mitre.org/ 关于OVAL的语法标准定义可以参考:OVAL_Language_Specification 。国内某安全研究者在Github上做了个简单概括总结,可以参考:OVAL学习。基于此标准,Redhat和Ubuntu官方都维护了一份存在漏洞的软件包版本规则列表。

通过将本地软件包和官方提供的最新规则库对比,就可以找出存在漏洞的软件包。那么,基于这种检测方法,笔者在基于Python语言开发HIDS相应模块中,找到了其相关的Python第三方库。

检测rpm包的Python第三方库为:version_utils

检测deb包的Python库为:apt_pkg

apt_pkg库在Debian系Linux系统中默认已经自带了,不需要额外安装。但是笔者的HIDS相应模块运行环境是在Centos下,而centos下的python包中并没有提供apt_pkg库。在查找pypi.org以及各种查找后也并没有找个相应的Python包。无奈,笔者只能根据apt包管理器的项目源码,自行编译出相关的Python第三方包。

查阅apt项目资料有:

至此,apt项目中核心部分的版本比对的代码(详见源码中的DoCmpVersion()函数)算是有了,但是笔者仔细看了其源码两遍都没有看懂!!其比对的算法还有略有复杂,采用Python重写这个算法怕是有点儿难。鉴于此,加上笔者之前有了解可以将c语言编译为Python库,所以笔者决定直接将其源码块提取出来,将其编程成.so库共python直接调用。

二、移植apt_pkg Python类库

对于如何将c语言编译为Python库,本文在此不做详细赘述。只是将当时编译c语言扩展的Python库的相关资料列出,有兴趣的同学可以自行了解、学习:

在此,笔者给出自己编译好的Python版apt_pkg库:apt_pkg.tar 。这里忽略详细的制作细节,编好的setup.py代码如下:

Python

# -*- coding: UTF-8 -*-

# author: s0nnet

# time: 2018-07-24

# desc: python extend of `apt_pkg`

# Note:

# This python extend ware compiled on centos 7.2 with python2.7

# It is self-contained on Debian's Linux platform but doesn't on RedHat.

# So, you need self compile it. here are some useful infermation:

# 1. apt project source code: https://github.com/chaos/apt

# 2. python-apt project source code: https://github.com/Jolicloud/python-apt

# 3. ibapt-pkg-dev: http://charette.no-ip.com:81/programming/doxygen/libapt-pkg/classdebVersioningSystem.html

from distutils.core import setup, Extension

_module = Extension('apt_pkg', sources=['debversion.c'])

setup(name="apt_pkg", version="1.0", ext_modules=[_module])

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

# -*- coding: UTF-8 -*-

# author: s0nnet

# time: 2018-07-24

# desc: python extend of `apt_pkg`

# Note:

#        This python extend ware compiled on centos 7.2 with python2.7

#   It is self-contained on Debian's Linux platform but doesn't on RedHat.

#   So, you need self compile it. here are some useful infermation:

#   1. apt project source code: https://github.com/chaos/apt

#   2. python-apt project source code: https://github.com/Jolicloud/python-apt

#   3. ibapt-pkg-dev: http://charette.no-ip.com:81/programming/doxygen/libapt-pkg/classdebVersioningSystem.html

fromdistutils.coreimportsetup,Extension

_module=Extension('apt_pkg',sources=['debversion.c'])

setup(name="apt_pkg",version="1.0",ext_modules=[_module])

通过上述的setup.py文件,可以很容易打包成Python第三方扩展类库,其常用打包命令如下:

Python

#python setup.py build # 编译

#python setup.py install # 安装

#python setup.py sdist # 生成压缩包(zip/tar.gz)

#python setup.py bdist_rpm # 生成rpm包

1

2

3

4

5

6

7

#python setup.py build     # 编译

#python setup.py install   # 安装

#python setup.py sdist     # 生成压缩包(zip/tar.gz)

#python setup.py bdist_rpm # 生成rpm包

至此,对于apt_pkg库的移植总算是完成了。其使用方法也和Debian下的apt_pkg包一致:

Python

# -*- coding: UTF-8 -*-

# author: s0nnet

# time: 2018-07-24

# desc: test

import apt_pkg

ver_a = "0.6.35-0ubuntu7"

ver_b = "0.6.35-0ubuntu7.2"

result = apt_pkg.version_compare(ver_a, ver_b)

print "version_compare result:", result

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

# -*- coding: UTF-8 -*-

# author: s0nnet

# time: 2018-07-24

# desc: test

importapt_pkg

ver_a="0.6.35-0ubuntu7"

ver_b="0.6.35-0ubuntu7.2"

result=apt_pkg.version_compare(ver_a,ver_b)

print"version_compare result:",result

三、Go语言版apt_pkg库

随着笔者所开发HIDS系统的进一步版本迭代,对整个系统的稳定性和性能提出了更高的要求。整个项目也从Python转为了使用Go语言重构。参考Github上相关开发者提供的Go语言版软件包版本比对,其项目如下:

这里笔者给出自己项目中用到的包含了Debian系和Redhat系两大类Linux系统的软件包版本比对算法的Go语言包:pkgVersion.tar (后期这块代码重构工作非笔者自己所做)。其使用方法比较简单,可以测试case:

Go

package vpkg

import (

"testing"

. "github.com/smartystreets/goconvey/convey"

)

func TestCompareVersion(t *testing.T) {

Convey("test apt version", t, func() {

So(CompareVersion("4.3-11+deb8u1", "4.3-11"), ShouldEqual, 1)

So(CompareVersion("4.3-11+deb8u1", "4.3-12"), ShouldEqual, -1)

So(CompareVersion("2.11.e1", "2.12"), ShouldEqual, -1)

So(CompareVersion("0A.3", "000B"), ShouldEqual, -1)

So(CompareVersion("2.11", "3"), ShouldEqual, -1)

So(CompareVersion("1.8.4-5ubuntu1.2", "1.8.4-5ubuntu1.3"), ShouldEqual, -1)

})

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

packagevpkg

import(

"testing"

."github.com/smartystreets/goconvey/convey"

)

funcTestCompareVersion(t *testing.T){

Convey("test apt version",t,func(){

So(CompareVersion("4.3-11+deb8u1","4.3-11"),ShouldEqual,1)

So(CompareVersion("4.3-11+deb8u1","4.3-12"),ShouldEqual,-1)

So(CompareVersion("2.11.e1","2.12"),ShouldEqual,-1)

So(CompareVersion("0A.3","000B"),ShouldEqual,-1)

So(CompareVersion("2.11","3"),ShouldEqual,-1)

So(CompareVersion("1.8.4-5ubuntu1.2","1.8.4-5ubuntu1.3"),ShouldEqual,-1)

})

}

至此,这篇文章算是已经结束了。这里也只是简单提到HIDS开发过程中关于系统软件包版本漏洞检测方法的一点点核心要点。关于HIDS中关于系统软件包版本漏洞检测的工程化技术实现及其检测原理,可以继续关注笔者关于HIDS开发方面的文章。

linux如何检测漏洞,Linux下检测漏洞软件包 | 独木の白帆相关推荐

  1. 第14篇:Struts2框架下Log4j2漏洞检测方法分析与总结

     Part1 前言  Log4j2漏洞出现有大半年的时间了,这个核弹级别的漏洞危害很大,但是这个漏洞检测起来却很麻烦,因为黑盒测试无法预判网站哪个应用功能在后台调用了log4j2记录日志功能.目前通用 ...

  2. 修复linux bash破壳漏洞,Linux下bash破壳漏洞检测及修复的方法

    如果Linux服务器存在bash破壳漏洞,将可能导致远程攻击者操作系统来执行任意命令,威胁等级较高,我想要知道我的Linux服务器是否存在bash破壳漏洞,以及如何来保护我的Linux服务器不受破壳漏 ...

  3. 修复linux bash破壳漏洞,Linux系统下如何检测并修复bash中的破壳漏洞​​

    问题:我想要知道我的Linux服务器是否存在bash破壳漏洞,以及如何来保护我的Linux服务器不受破壳漏洞侵袭. 2014年9月24日,一位名叫斯特凡·沙泽拉的安全研究者发现了一个名为"破 ...

  4. linux 心脏滴血漏洞,心脏出血漏洞(heartbleeder 自动检测 OpenSSL 心脏出血漏洞 (附修复指南))...

    心脏出血漏洞(heartbleeder 自动检测 OpenSSL 心脏出血漏洞 (附修复指南)),哪吒游戏网给大家带来详细的心脏出血漏洞(heartbleeder 自动检测 OpenSSL 心脏出血漏 ...

  5. Linux下检测网络状态是否正常

    // Linux下检测网络状态是否正常 #include <sys/types.h> #include <string.h> #include <stdlib.h> ...

  6. linux下openssh5.3漏洞,linux的低版本中openssh三大漏洞的分析及修复方法

    一:漏洞分析最近进行linux系统安全加固分析,进行漏洞扫描扫描分析,不扫不知道,一扫吓一跳,linux系统服务器的 OPENSSH存在3大安全漏洞,祥如下: 1:OpenSSH GSSAPI 处理远 ...

  7. linux系统检测硬盘物理损坏,linux系统下检测硬盘上的坏道和坏块

    linux系统下检测硬盘上的坏道和坏块 发布时间:2020-02-28 22:22:57 来源:51CTO 阅读:1127 作者:赤练挚爱 磁盘坏道检测 当磁盘出现以下情况:io wait 无故增高或 ...

  8. linux下硬件检测工具,Linux硬件检测工具

    Linux下的硬件检测和识别软件,做得比较完善了.选购Laptop,如果是自带Linux系统,完全可以用它们来检测硬件. 首先出场的当然是: 1. dmidecode  www.nongnu.org/ ...

  9. linux 查看u盘文件,详细介绍Linux系统下检测U盘是不是已经连接的方法

    Linux操作系统是基于Unix操作系统发展而来的一种克隆系统,它诞生于1991年的10月5日(这是第一次正式向外公布的时间).今天就跟着小编一起来看一看:详细介绍linux系统下检测U盘是不是已经连 ...

最新文章

  1. [转]计算机读研的取向
  2. 深入理解python异步编程_深入理解Python异步编程
  3. django使用用户名或手机号码登录
  4. bootstrap上传图片可实现查看上一张图片和下一张图片_如何实现像人民日报微信推文一样的的点亮效果?...
  5. python解决单调栈问题
  6. eclipse 下安装插件
  7. 《深入理解计算机系统》速读提问
  8. 抽象类、接口、内部类
  9. ILSpy反编译软件的使用
  10. win版mysql下载_MYSQL下载及安装--windows版本
  11. 能量谱 matlab,频谱、幅度谱、功率谱和能量谱含义
  12. flink-HA集群搭建和问题记录
  13. firefox android手势,6款Firefox鼠标手势扩展推荐
  14. 华迪杯计算机设计大赛省赛奖金,西南财经大学天府学院学子在2019年“华迪杯”中国大学生计算机设计大赛四川省级赛中获佳绩...
  15. tipask 问答系统 如何设置第三方一键登录
  16. ICPC训练联盟2021寒假冬令营(5)(部分题解):
  17. [图] Google 迎来全新 Logo 启用无衬线字体
  18. 2022 大一大二基础hive考试题
  19. Linux系统重设开机秘码-------忘记linux开机密码
  20. python中pack函数_关于pack()函数的文章推荐10篇 - pack

热门文章

  1. 关于log 报红解决方法
  2. SQLZOO学习,答案
  3. 字体和常用web字体
  4. Python入门100例(二)
  5. linux电子书解决方案Calibre
  6. 《缠中说禅108课》92:中枢震荡的监视器
  7. android电视投影ipad,【沙发管家】苹果手机,,iPad连接安卓智能电视投屏方法
  8. STM32-NVIC中断优先级管理
  9. matplotlib 误差线
  10. 北斗gps Android hal层so库代码