def auto_vuler_association(request): pack_id = ReqParams.one(request, 'pack_id') task_id = start_check_component_task(pack_id) if task_id is None: return sys_app_ok_p("自动组件漏洞关联正在运行中") return sys_app_ok_p(MyTask.fetch_exec_info(task_id))
def get_task_result(request): # 从请求中取参数:文件 ID task_id = req_get_param(request, 'task_id') # 从缓存中读取任务执行信息 task_info = MyTask.fetch_exec_info(task_id) return sys_app_ok_p(task_info)
def async_fw_functions_list(request): # 从请求中取参数:文件 ID file_id = req_get_param(request, 'file_id') # 启动分析任务 task = MyTask(_proc_fw_functions_list, (file_id, )) task_id = task.get_task_id() # 返回响应:任务初始化的信息 return sys_app_ok_p(MyTask.fetch_exec_info(task_id))
def async_fwdownload(request): # 获取下载URL downloadurl = req_get_param(request, 'url') print(downloadurl) # 启动下载任务 task = MyTask(_proc_func_download, (downloadurl, settings.FW_PATH, )) task_id = task.get_task_id() # 返回响应:任务初始化的信息 return sys_app_ok_p(MyTask.fetch_exec_info(task_id))
def get_task_result(request): # 从请求中取参数:任务 ID task_id = req_get_param(request, 'task_id') # 从缓存中读取任务执行信息 task_info = MyTask.fetch_exec_info(task_id) # 保存操作日志 LogRecords.save(task_info, category='query_task', action='查询任务状态', desc='读取任务(ID=%s)当前执行状态及结果信息' % task_id) return sys_app_ok_p(task_info)
def async_function_call_graph(request): # 从请求中取参数:文件 ID,函数地址 file_id, func_addr = _req_params(request) # 启动分析任务 task = MyTask(_proc_func_call_graph, ( file_id, func_addr, )) task_id = task.get_task_id() # 返回响应:任务初始化的信息 return sys_app_ok_p(MyTask.fetch_exec_info(task_id))
def taint_func_list(request): # 从请求中取参数:文件 ID file_id = ReqParams.one(request, 'file_id') # 查找函数列表分析结果 # 查询文件 CFG 分析的标记 is_cfg = CfgAnalyzeService.has_cfg_analyze(file_id) if not is_cfg: # 启动分析任务 task_id = CfgAnalyzeService.start_cfg_task(file_id) # 保存操作日志 LogRecords.save({ 'task_id': task_id, 'file_id': file_id }, category='analysis', action='分析CFG', desc='对二进制文件做调用流程图分析') # 返回响应:任务初始化的信息 return sys_app_ok_p(MyTask.fetch_exec_info(task_id)) # 启动分析任务 functions = FilesService.functions_list(file_id) if len(functions) == 0: return sys_app_err(Error.FW_FILE_NO_CFG_ANALYZE) taint_func_list = [] taint_funcs = [] taint_list = func_taint_col.find() for taint_info in taint_list: taint_funcs.append(taint_info.get('func_name')) for func_info in functions: func_name = func_info.get('name') for taint_func_info in taint_funcs: if taint_func_info == func_name: taint_func_list.append(taint_func_info) # 保存操作日志 LogRecords.save('', category='query', action='查询污点函数列表', desc='查询指定固件文件(ID=%s)在代码分析中产生的函数列表' % file_id) return sys_app_ok_p({ 'taint_num': len(taint_func_list), 'taint_func_list': taint_func_list })
def async_funcs_fetch(request): # 获取固件ID firmware_id = req_get_param(request, 'firmware_id') # 启动任务 存储桶读取固件内容 task = MyTask(_proc_fetch, (firmware_id, settings.FW_PATH)) task_id = task.get_task_id() # 保存操作日志 LogRecords.save({'task_id': task_id, 'file_id': firmware_id}, category='fetch', action='下载固件', desc='存储桶读取固件保存并进行文件抽取') # 返回响应:任务初始化的信息 return sys_app_ok_p(MyTask.fetch_exec_info(task_id))
def async_com_download(request): com_download_url = ReqParams.one(request, 'url', protocol='POST') # 启动下载任务 extra_info = {'task_type': TaskType.REMOTE_DOWNLOAD, 'task_name': '组件源码下载', 'task_desc': '下载组件源码入库存储桶'} task = MyTask(_proc_component_tasks, (com_download_url, MyPath.component()), extra_info=extra_info) task_id = task.get_task_id() # 保存操作日志 LogRecords.save({'task_id': task_id}, category='download', action='组件源码下载', desc='下载组件源码入库存储桶') # 返回响应:任务初始化的信息 return sys_app_ok_p(MyTask.fetch_exec_info(task_id))
def async_fwdownload(request): # 获取下载URL fw_download_url, ftp_user, ftp_password = ReqParams.many(request, ['url', 'user', 'password'], protocol='POST') # 启动下载任务 extra_info = {'task_type': TaskType.REMOTE_DOWNLOAD, 'task_name': '固件下载', 'task_desc': '下载固件入库存储桶并进行文件抽取操作'} task = MyTask(_proc_tasks, (fw_download_url, settings.FW_PATH, ftp_user, ftp_password), extra_info=extra_info) task_id = task.get_task_id() # 保存操作日志 LogRecords.save({'task_id': task_id}, category='download', action='固件下载', desc='下载固件入库存储桶并进行文件抽取操作') # 返回响应:任务初始化的信息 return sys_app_ok_p(MyTask.fetch_exec_info(task_id))
def analyze_cfg(request): # 从请求中取参数:文件 ID file_id = req_post_param(request, 'file_id') # 启动分析任务 task_id = CfgAnalyzeService.start_cfg_task(file_id) # 保存操作日志 LogRecords.save({ 'task_id': task_id, 'file_id': file_id }, category='analysis', action='分析CFG', desc='对二进制文件做调用流程图分析') # 返回响应:任务初始化的信息 return sys_app_ok_p(MyTask.fetch_exec_info(task_id))
def search_tasks_by_pack(request): # 从请求中取参数:包 ID pack_id = req_get_param(request, 'pack_id') if pack_id is None: return sys_app_ok_p([]) tasks_list = TasksDAO.search_by_pack(pack_id) task_info_list = [] for task_info in tasks_list: # 没有执行完成的任务状态,用缓存中任务信息代替 if task_info['task_status'] != TaskStatus.COMPLETE: task_info = MyTask.fetch_exec_info(task_info['task_id']) task_info_list.append(task_info) # 保存查询日志 LogRecords.save(task_info_list, category='query_task', action='查询固件包任务', desc='查询指定的固件包(ID=%s)所有的任务信息' % pack_id) return sys_app_ok_p(task_info_list)
def run_percent_cb(self, percentage, **kwargs): # 由于大于50%进程后没有 project 可以获取,需要做进度百分比转换 # if 'cfg' in kwargs: # if 'cfg' in kwargs: # 从动态参数中获取 project 中保存的任务 ID # task_id = kwargs['cfg'].project.my_task_id task_id = self.task_id # 调试信息打印 info = 'Func-list({}): {}%'.format(task_id, percentage) print(info) print(self.task_id) # 只在运行百分比变化时才更新任务状态 new_percentage = self.translate_percent(percentage) exec_info = MyTask.fetch_exec_info(task_id) old_percentage = exec_info['percentage'] if new_percentage != old_percentage: MyTask.save_exec_info(task_id, new_percentage)
def test(request): value = ReqParams.one(request, 'value', protocol='GET') # 启动下载任务 extra_info = { 'task_type': TaskType.REMOTE_DOWNLOAD, 'task_name': 'test组件源码下载', 'task_desc': 'test下载组件源码入库存储桶' } task = MyTask(_proc_inverted_tasks, (value, MyPath.component()), extra_info=extra_info) task_id = task.get_task_id() # 保存操作日志 LogRecords.save({'task_id': task_id}, category='download', action='test组件源码下载', desc='test下载组件源码入库存储桶') # 返回响应:任务初始化的信息 return sys_app_ok_p(MyTask.fetch_exec_info(task_id))
def inverted(request): # 获取参数 file_id = req_get_param(request, 'file_id') # 启动编译任务 extra_info = { 'task_type': TaskType.INVERTED, 'task_name': '倒排索引', 'task_desc': '建立倒排索引' } task = MyTask(_proc_inverted_tasks, (file_id, ), extra_info=extra_info) task_id = task.get_task_id() # 保存操作日志 LogRecords.save({'task_id': task_id}, category='compile', action='倒排索引', desc='建立倒排索引') # 返回响应:任务初始化的信息 return sys_app_ok_p(MyTask.fetch_exec_info(task_id))
def analyze_cfg_auto(request): # 启动自动CFG分析任务 # 启动分析任务 task_id = CfgAnalyzeService.auto_cfg_task() # # 保存操作日志 # LogRecords.save({'task_id': task_id, 'file_id': file_id}, category='analysis', action='分析CFG', # desc='对二进制文件做调用流程图分析') # 返回响应:任务初始化的信息 return sys_app_ok_p(MyTask.fetch_exec_info(task_id)) # task = MyTask(_proc_cfg_analyze, ) # task_id = task.get_task_id() # # # 返回响应:任务初始化的信息 # return sys_app_ok_p(MyTask.fetch_exec_info(task_id)) # def _proc_cfg_analyze(task_id): # # 启动分析任务 # CfgAnalyzeService.auto_cfg_task(task_id)
def compile(request): # 获取编译参数 arch, pack_id = ReqParams.many(request, ['arch', 'pack_id']) # 启动编译任务 extra_info = { 'pack_id': pack_id, 'task_type': TaskType.COMPONENT_COMPILE, 'task_name': '组件编译', 'task_desc': '组件编译及入库操作' } task = MyTask(_proc_compile_tasks, (arch, pack_id), extra_info=extra_info) task_id = task.get_task_id() # 保存操作日志 LogRecords.save({'task_id': task_id}, category='compile', action='组件编译', desc='组件编译及入库操作') # 返回响应:任务初始化的信息 return sys_app_ok_p(MyTask.fetch_exec_info(task_id))
def cfg_func_list(request): # 从请求中取参数:文件 ID file_id = ReqParams.one(request, 'file_id') # 查找函数列表分析结果 # 查询文件 CFG 分析的标记 is_cfg = CfgAnalyzeService.has_cfg_analyze(file_id) if not is_cfg: # 启动分析任务 task_id = CfgAnalyzeService.start_cfg_task(file_id) # 保存操作日志 LogRecords.save({ 'task_id': task_id, 'file_id': file_id }, category='analysis', action='分析CFG', desc='对二进制文件做调用流程图分析') # 返回响应:任务初始化的信息 return sys_app_ok_p(MyTask.fetch_exec_info(task_id)) # 启动分析任务 functions = FilesService.functions_list(file_id) # 查找函数列表分析结果 # functions = CfgAnalyzeResultDAO.get_functions(file_id) if len(functions) == 0: return sys_app_err(Error.FW_FILE_NO_CFG_ANALYZE) # 保存操作日志 LogRecords.save('', category='query', action='查询函数列表', desc='查询指定固件文件(ID=%s)在代码分析中产生的函数列表' % file_id) return sys_app_ok_p({ 'functions_count': len(functions), 'functions': functions })
def detect_vulner(request): file_id = ReqParams.one(request, 'file_id') # pack_id = ReqParams.one(request, 'pack_id') # fw_vul_analyze = FwVulnerAnalyze(file_id) # res = fw_vul_analyze.vuler_analyze() # return sys_app_ok_p({'res': res}) # 查询文件 detect 分析的标记 is_detect = OverflowDetectService.has_detect_overflow(file_id) if not is_detect: # 启动detect任务 task_id = OverflowDetectService.start_detect_task(file_id) # 保存操作日志 LogRecords.save({ 'task_id': task_id, 'file_id': file_id }, category='analysis', action='分析OVERFLOW', desc='对二进制文件做溢出漏洞分析') # 返回响应:任务初始化的信息 return sys_app_ok_p(MyTask.fetch_exec_info(task_id)) file_item = FwFileDO.find(file_id) buffer_overflow = file_item.get('buffer_overflow') integer_overflow = file_item.get('integer_overflow') cmd_injection_overflow = file_item.get('cmd_injection_overflow') # return sys_app_ok_p({'缓冲区溢出': buffer_overflow, '整数溢出': integer_overflow, '命令注入溢出': cmd_injection_overflow}) overflow_list = [] overflow_list.append({"name": "缓冲区溢出", "value": buffer_overflow}) overflow_list.append({"name": "整数溢出", "value": integer_overflow}) overflow_list.append({"name": "命令注入溢出", "value": cmd_injection_overflow}) return sys_app_ok_p({'overflow': overflow_list})
def websocket_callback(task_id, process, percent=50): print(task_id) # 从缓存或数据库中读取该任务的记录 task_info = MyTask.fetch_exec_info(task_id) # 没有该任务信息记录时,返回失败 if task_info is None: return False # 计算并记录执行时间(预计剩余时间) task_info['remain_time'] = MyTask._calc_exec_time(task_info) # 设置当前记录时间 task_info['record_time'] = SysUtils.get_now_time_str() # 设置百分比和运行状态 task_info['percentage'] = percent value_list = process.split('\n') for result in value_list: # 结果集不为空时,用新的结果集替换 if result is not None: task_info['result'] = result # 调用 websocket task_feedback task_feedback(task_id, task_info)