def check_component(pack_id, task_id):

    MyRedis.set('running_check_com_flag', True)

    # 获取本固件包所有的二进制可执行文件记录
    fw_files_list = FwFileDO.search_files_of_pack(pack_id, FileType.EXEC_FILE)
    pack_item = PackFileDO.fetch_pack(pack_id)
    process_file_name = pack_item.get('name')  # pack_item['name']
    MyTask.save_exec_info_name(task_id, process_file_name)

    # 枚举每个文件,根据文件名检索组件库(make),校验
    total_count = len(fw_files_list)
    for index, file_item in enumerate(fw_files_list):
        percentage = round(index * 100 / total_count, 1)
        MyTask.save_exec_info(task_id, percentage)

        componentinfo = MakeCOMFileDO.search_component_name(
            file_item['file_name'])
        if componentinfo is None:
            continue
        FwFileDO.set_component(file_item['file_id'], 1)
        # 相似度匹配计算,标记漏洞(version / edbid)
        fw_file_id = file_item['file_id']
        component_file_id = componentinfo['file_id']

        print(SysUtils.get_now_time())
        # 计算相似度 比较耗时 openssl计算大约两分钟
        similarity = assembly.calc_cosine_algorithm(fw_file_id,
                                                    component_file_id)
        print(SysUtils.get_now_time())

        # 相似度阈值设定: 0-100
        if similarity < utils.sys.config.g_similarity:
            print(similarity)
            continue
        # 相似度大于阈值 标记漏洞(version / edbid)
        com_file_info = PackCOMFileDO.fetch_pack(componentinfo['pack_id'])
        version = com_file_info['version']
        name = com_file_info['name']
        edb_id = com_file_info['edb_id']
        FwFileDO.set_component_extra_props(
            fw_file_id, {
                'version': version,
                'name': name,
                'edb_id': edb_id,
                'similarity': similarity
            })

    MyRedis.set('running_check_com_flag', False)

    # 保存任务完成状态
    MyTask.save_exec_info(task_id, 100.0)

    return
    def save_file_item(pack_id,
                       file_id,
                       file_name,
                       file_type,
                       mode,
                       file_path='',
                       extra_props=None):
        # 如果文件路径未给定,则使用文件名称代替
        if len(file_path) == 0:
            file_path = file_name

        doc = {
            'pack_id': pack_id,
            'file_id': file_id,
            'file_name': file_name,
            'file_path': file_path,
            'file_type': file_type,
            'mode': mode,
            'create_time': SysUtils.get_now_time()
        }
        if extra_props is not None:
            doc['extra_props'] = extra_props

        # 更新一条函数分析结果,如果没有旧记录,则创建一条新记录
        rv = source_code_files_coll.update_one(
            {
                'file_id': file_id,
                'file_path': file_path
            }, {'$set': doc}, True)
Пример #3
0
def add(request):
    # firmware_id = req_post_param(request, "firmware_id")
    title = req_post_param(request, "title")
    author = req_post_param(request, "author")
    type = req_post_param(request, "type")
    platform = req_post_param(request, "platform")

    # 获取可用的firmware_id,内部检查取值范围和是否冲突(firmware_id需要唯一)
    firmware_id = firmware_db.get_suggest_firmware_id(None)

    # with utils.sys.config.g_mongo_client.start_session(causal_consistency=True) as session:
    #     """事物必须在session下执行,with保证了session的正常关闭"""
    # with session.start_transaction():
    #     """一旦出现异常会自动调用session.abort_transaction()"""
    # 获取各字段的索引号,如果是新值,则添加一条新索引,并返回新的id号
    author_id = firmware_db.fetch_field_id('author', author)
    type_id = firmware_db.fetch_field_id('type', type)
    platform_id = firmware_db.fetch_field_id('platform', platform)

    # 组装漏洞信息,并添加
    item = {'description': [firmware_id, title], 'date_published': SysUtils.get_now_time().strftime('%Y-%m-%d'),
            'verified': 0, 'port': 0, 'customized': 1,
            'author': {'id': author_id, 'name': author}, 'type': {'id': type_id, 'name': type},
            'platform': {'id': platform_id, 'platform': platform}, 'firmware_id': firmware_id}
    result = firmware_db.add(item)

    # 为性能测试中降低CPU使用率,小段延时
    time.sleep(1.0)

    # 本版本不检查成功与否
    #SysLog.success('新建漏洞', '成功添加漏洞信息,漏洞ID={}'.format(firmware_id))
    return app_ok_p({'firmware_id': firmware_id, 'customized': 1, 'date_published': item['date_published']})
 def save(pack_id, file_id, edb_id, title, version, path_file_name, name=None, description='', pack_type=PackType.REAL,
          source_type=FileSource.REMOTE_DOWNLOAD, file_type=FileType.OTHER_FILE, source_addr=''):
     doc = {'pack_id': pack_id, 'file_id': file_id, 'edb_id': edb_id, 'title': title, 'version': version, 'compile': 0, 'name': name,
            'file_path': path_file_name, 'description': description,
            'pack_type': pack_type, 'source_type': source_type, 'file_type': file_type, 'source_addr': source_addr,
            'create_time': SysUtils.get_now_time()}
     # 更新一条函数分析结果,如果没有旧记录,则创建一条新记录
     pack_com_files_coll.update_one({'pack_id': pack_id}, {'$set': doc}, True)
 def save(file_id, task_id, cfg_result):
     doc = {
         'file_id': file_id,
         'task_id': task_id,
         'create_time': SysUtils.get_now_time()
     }
     doc = dict(doc, **cfg_result)
     # 更新一条 cfg 分析结果,如果没有旧记录,则创建一条新记录
     cfg_result_col.update_one({'file_id': file_id}, {'$set': doc}, True)
Пример #6
0
 def _build_common_keys(file_id, func_addr, key_name, data_dict):
     func_addr_hex = hex(func_addr)
     return {
         'file_id': file_id,
         'func_addr': func_addr,
         'func_addr_hex': func_addr_hex,
         key_name: data_dict,
         'update_time': SysUtils.get_now_time()
     }
Пример #7
0
    def save(log_contents, category='debug', action='普通操作', desc='操作日志', user='******'):
        # 根据系统配置,不在配置参数中的日志类型,不做日志记录
        if not SystemConfig.is_log_on(category):
            return

        log_uuid = StrUtils.uuid_str()
        create_time = SysUtils.get_now_time()
        logs_coll.update_one({'uuid': log_uuid},
                             {'$set': {
                                 'uuid': log_uuid,
                                 'category': category,
                                 'action': action,
                                 'description': desc,
                                 'content': log_contents,
                                 'user_account': user,
                                 'create_time': create_time
                             }}, True)
        return
 def _build_common_keys(file_id, key_name, data_dict):
     return {'file_id': file_id, key_name: data_dict, 'update_time': SysUtils.get_now_time()}