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)
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)
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() }
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()}