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))
Exemple #4
0
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
    })
Exemple #8
0
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))
Exemple #9
0
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))
Exemple #10
0
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)