def com_sourcecode_files_tree(request):
    pack_id, tree_type = ReqParams.many(request, ['pack_id', 'tree_type'])
    file_list = SourceCodeFileDO.search_files_of_pack(pack_id)

    if tree_type is None or len(tree_type) == 0 or tree_type == 'normal':
        tree_type = 'normal'
        exec_tree = {}
    elif tree_type == 'antd':
        exec_tree = []
    else:
        tree_type = 'normal'
        exec_tree = {}

    # 对每个文件做树的各级节点定位和创建
    for file in file_list:
        # 获取文件路径
        file_path = file['file_path']
        file_id = file['file_id']

        if file_path is None or len(file_path) == 0:
            continue

        if tree_type == 'normal':
            MyTree.file_path_insert_into_tree(exec_tree, file_path, file_id)
        elif tree_type == 'antd':
            MyTree.file_path_insert_into_antd_tree(exec_tree, file_path,
                                                   file_id)

    # 保存操作日志
    LogRecords.save('',
                    category='statistics',
                    action='查询组件源码文件目录树',
                    desc='获取组件源码文件目录树(模式为:%s)' % (tree_type))

    return sys_app_ok_p(exec_tree)
Пример #2
0
    def init_exec_status(self):
        # 初始化缓存的任务信息
        task_info = {
            'task_id': self._task_id,
            'start_time': SysUtils.get_now_time_str(),
            'task_status': TaskStatus.RUNNING,
            'percentage': 0.0,
            'progress_history': [],
            'result': {}
        }
        task_info = dict(task_info, **self._extra_info)
        # 缓存该任务信息
        MyRedis.set(self._task_id, task_info, category=task_cat)

        # 在数据库中保存任务记录
        TasksDAO.save(task_info)

        # 保存任务详情日志
        LogRecords.save(task_info,
                        category='task',
                        action='任务启动',
                        desc='记录任务启动时状态及任务信息')

        # 返回该任务信息
        return task_info
def pack_delete(request):
    pack_id = ReqParams.one(request, 'pack_id')

    # delete fw_files_storage
    # delete fw_files
    # delete pack_files_storage
    # delete pack_files

    file_list = FwFileDO.search_files_of_pack(pack_id)
    for file in file_list:
        FwFilesStorage.delete(file['file_id'])

    # if len(file_list) > 0:
    FwFileDO.delete_many_of_pack(pack_id)

    pack_info = PackFileDO.fetch_pack(pack_id)
    PackFilesStorage.delete(pack_info['file_id'])

    PackFileDO.delete(pack_id)

    # 保存操作日志
    LogRecords.save('',
                    category='statistics',
                    action='删除固件包',
                    desc='删除指定固件包(ID=%s)的信息,' % pack_id)

    return sys_app_ok_p([])
def test_log_switch(request):
    log_configs = SystemConfig.get_cache_log_cfg()
    keys = log_configs.keys()
    for category in keys:
        LogRecords.save('test_log_switch: ' + category,
                        category=category,
                        action='test_log_switch')
    return sys_app_ok()
def function_info(request):
    # 从请求中取参数:文件 ID、函数地址
    file_id, func_addr, extra_info = ReqParams.many(
        request, ['file_id', 'func_addr.hex', 'extra_info'])

    # 获取指定函数的汇编、中间码等代码信息
    codes_dict = FunctionsService.func_codes(file_id, func_addr)
    infos_dict = codes_dict

    if extra_info is not None:
        # 取出首尾空格后分割成列表(用逗号分隔)
        extra_list = extra_info.strip().split(',')
        if 'props' in extra_list:
            # 如指定 props 则附加函数属性信息
            props_dict = FunctionsService.func_props(file_id, func_addr)
            infos_dict['props'] = props_dict
        if 'vars' in extra_list:
            # 如指定 props 则附加函数变量信息
            vars_dict = VarsService.extract_vars(file_id, func_addr)
            infos_dict['vars'] = vars_dict

    infos_dict['vulnerabe'] = {
        'flag': '0',
        'desc': '非脆弱性函数'
    }  # 0:非脆弱性函数 1:脆弱性函数
    infos_dict['taint'] = {'flag': '0', 'desc': '非污点函数'}  # 0:非污点函数 1:非污点函数
    func_name = infos_dict.get('function_name')

    if func_name is not None:
        vulner_info = func_vulner_col.find_one(
            {'func_name': {
                '$regex': func_name
            }})

        if vulner_info is not None:
            infos_dict['vulnerabe'] = {
                'flag': '1',
                'desc': '脆弱性函数'
            }  # 0:非脆弱性函数 1:脆弱性函数

        taint_info = func_taint_col.find_one(
            {'func_name': {
                '$regex': func_name
            }})

        if taint_info is not None:
            infos_dict['taint'] = {
                'flag': '1',
                'desc': '污点函数'
            }  #  0:非污点函数 1:非污点函数

    # 保存操作日志
    LogRecords.save('',
                    category='query',
                    action='查询函数分析信息',
                    desc='查询代码分析后的函数信息,文件ID=%s,函数地址=0x%x' %
                    (file_id, func_addr))
    return sys_app_ok_p(infos_dict)
def pack_exec_files_tree(request):
    pack_id, tree_type = ReqParams.many(request, ['pack_id', 'tree_type'])

    start_check_component_task(pack_id)
    # # # 检查组件关联
    # # check_component(pack_id, FileType.EXEC_FILE)
    # # 修改为任务处理方式进行检查组件关联 关联组件标记,相似度匹配计算,标记漏洞(version/edbid)
    # # 启动编译任务
    # extra_info = {'task_type': TaskType.COMPONENT_CHECK,
    #               'task_name': '检查组件关联',
    #               'task_desc': '检查组件关联,相似度匹配计算,标记漏洞(version/edbid)'}
    # task = MyTask(check_component, (pack_id,), extra_info=extra_info)
    # task_id = task.get_task_id()

    # 读取所有可执行文件
    exec_list = FwFileDO.search_files_of_pack(pack_id, FileType.EXEC_FILE)

    if tree_type is None or len(tree_type) == 0 or tree_type == 'normal':
        # file_path_insert_into_tree 树,初始化为字典
        tree_type = 'normal'
        exec_tree = {}
    elif tree_type == 'antd':
        # file_path_insert_into_antd_tree 树,初始化为数组
        exec_tree = []
    else:
        tree_type = 'normal'
        exec_tree = {}

    # 对每个文件做树的各级节点定位和创建
    for exec_file in exec_list:
        # 获取文件路径
        file_path = exec_file['file_path']
        file_id = exec_file['file_id']

        component = exec_file['component']
        # if exec_file['component'] is not None:
        #     component = exec_file['component']
        # else:
        #     component = 0

        if file_path is None or len(file_path) == 0:
            continue

        if tree_type == 'normal':
            MyTree.file_path_insert_into_tree(exec_tree, file_path, file_id,
                                              component)
        elif tree_type == 'antd':
            MyTree.file_path_insert_into_antd_tree(exec_tree, file_path,
                                                   file_id, component)

    # 保存操作日志
    LogRecords.save('',
                    category='statistics',
                    action='读取固件包文件结构',
                    desc='获取指定固件包(ID=%s)的文件结构(模式为:%s)' % (pack_id, tree_type))

    return sys_app_ok_p(exec_tree)
def query_component(request):
    # path('task/query_component', task_view.query_component, name='task_query_component'),
    # 读取数据库任务集合
    task_id_list = TasksDAO.all_component()

    # 保存操作日志
    LogRecords.save(task_id_list, category='query', action='查询组件任务状态')

    return sys_app_ok_p(task_id_list)
Пример #8
0
def taintmodify(request):
    # 从请求中取参数:文件 ID
    func_name, hazard, solution = ReqParams.many(request, ['func_name', 'hazard', 'solution'], protocol='POST')

    TaintdictDO.update(func_name, hazard, solution)
    # 保存操作日志
    LogRecords.save('', category='statistics', action='自定义污点函数-删除',
                    desc='污点函数(func_name=%s)的信息,' % func_name)

    return sys_app_ok_p([])
def stop_task(request):
    # 从请求中取参数:任务 ID
    task_id = req_get_param(request, 'task_id')

    task_info = MyTask.stop_task(task_id)

    # 保存操作日志
    LogRecords.save(task_info, category='task', action='停止任务',
                    desc='停止指定的任务(ID=%s)' % task_id)

    return sys_app_ok_p(task_info)
def com_files_list(request):
    # 读取所有组件文件
    com_list = FwFileDO.search_all_com_files()
    print(com_list)
    comlist = []

    for com in com_list:
        print(com)
        inverted = com.get('inverted')
        cfg_analyze = com.get('cfg_analyze')
        file_type_verified = com.get('file_type_verified')
        extra_props = com.get('extra_props')

        if extra_props is not None:
            extra_props.setdefault('name', '')
            extra_props.setdefault('version', '')
            extra_props.setdefault('edb_id', '')
            extra_props.setdefault('similarity', '')

            name = extra_props['name']
            version = extra_props['version']
            edb_id = extra_props['edb_id']
            similarity = extra_props['similarity']
        else:
            name = ""
            version = ""
            edb_id = ""
            similarity = ""

        doc = {
            'file_id': com['file_id'],
            'file_path': com['file_path'],
            'component': com['component'],
            'create_time': com['create_time'],
            'file_name': com['file_name'],
            'file_type': com['file_type'],
            'pack_id': com['pack_id'],
            'version': version,
            'name': name,
            'edb_id': edb_id,
            'file_type_verified': file_type_verified,
            'cfg_analyze': cfg_analyze,
            'inverted': inverted,
            'similarity': similarity,
            'fw_name': com['pack_docs'][0]['name']
        }
        comlist.append(doc)

    # 保存操作日志
    LogRecords.save('',
                    category='statistics',
                    action='查询所有组件文件列表',
                    desc='查询所有组件文件列表')
    return sys_app_ok_p(comlist)
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)
Пример #12
0
def read_sys_config(request):
    read_all = ReqParams.one(request, 'all_config.int')

    # 从数据库中读取系统配置
    config = SystemConfig.read_db(read_all)

    # 保存操作日志
    LogRecords.save(config,
                    category='system_config',
                    action='读取系统配置',
                    desc='读取系统各项配置参数')

    return sys_app_ok_p(config)
def search_tasks_by_file(request):
    # 从请求中取参数:文件 ID
    file_id = req_get_param(request, 'file_id')
    if file_id is None:
        return sys_app_ok_p([])

    tasks_list = TasksDAO.search_by_file(file_id)

    # 保存查询日志
    LogRecords.save(tasks_list, category='query_task', action='查询文件任务',
                    desc='查询指定的文件(ID=%s)所有的任务信息' % file_id)

    return sys_app_ok_p(tasks_list)
Пример #14
0
def taintdel(request):
    # 从请求中取参数:文件 ID
    func_name = ReqParams.one(request, 'func_name')
    ret = TaintdictDO.delete(func_name)

    # 保存操作日志
    LogRecords.save('', category='statistics', action='自定义污点函数-删除',
                    desc='污点函数(func_name=%s)的信息,' % func_name)

    if ret:
        return sys_app_ok_p('删除成功')
    else:
        return sys_app_ok_p('删除失败')
def entry_state_info(request):
    # 从请求中取参数:文件 ID
    file_id = req_get_param(request, 'file_id')

    info = FilesService.bin_state_info(file_id)

    # 保存操作日志
    LogRecords.save(info,
                    category='analysis',
                    action='入口状态机',
                    desc='分析可执行文件的入口状态机参数')

    return sys_app_ok_p(info)
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 pack_info(request):
    pack_id = ReqParams.one(request, 'pack_id')

    # 读取指定固件包的信息
    pack_service = PackInfoService(pack_id, None)
    info = pack_service.pack_summary()

    # 保存操作日志
    LogRecords.save('',
                    category='statistics',
                    action='查询包信息',
                    desc='查询指定固件包(ID=%s)的信息,统计其文件数量,查询任务信息' % pack_id)

    return sys_app_ok_p(info)
def get_all_task_result(request):
    # 读取数据库任务集合
    task_id_list = TasksDAO.all_tasks()
    # task_info_list = []
    # # 从缓存中读取任务执行信息
    # for task in task_id_list:
    #     print(task['task_id'])
    #     task_info = MyTask.fetch_exec_info(task['task_id'])
    #     task_id_list.append(task_info)

    # 保存操作日志
    LogRecords.save(task_id_list, category='query', action='查询全部任务状态')

    return sys_app_ok_p(task_id_list)
def pack_edit(request):
    pack_id, manufacturer, model, version = ReqParams.many(
        request, ['pack_id', 'manufacturer', 'model', 'version'],
        protocol='POST')

    PackFileDO.save_manufacturer(pack_id, manufacturer, model, version)

    # 保存操作日志
    LogRecords.save('',
                    category='statistics',
                    action='编辑指定固件包信息',
                    desc='编辑指定固件包信息 厂商 型号(ID=%s)的信息' % pack_id)

    return sys_app_ok_p([])
Пример #20
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))
Пример #21
0
def info(request):
    pack_id = ReqParams.one(request, 'pack_id')

    com_info = PackCOMFileDO.fetch_pack(pack_id)
    # 读取指定固件包的信息
    files_stat = get_sourcecode_files_stat(pack_id)
    pack_info = dict(com_info, **files_stat)

    # 保存操作日志
    LogRecords.save('',
                    category='statistics',
                    action='查询组件源码包信息',
                    desc='查询组件源码包的信息,统计其文件数量,查询任务信息')

    return sys_app_ok_p(pack_info)
Пример #22
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))
Пример #23
0
    def save_exec_info(task_id, percent, result=None, notify=True):
        # 从缓存或数据库中读取该任务的记录
        task_info = MyTask.fetch_exec_info(task_id)

        # 没有该任务信息记录时,返回失败
        if task_info is None:
            return False

        # 设置百分比和运行状态
        task_info['percentage'] = percent

        # 结果集不为空时,用新的结果集替换
        if result is not None:
            task_info['result'] = result

        # 计算并记录执行时间(预计剩余时间)
        task_info['remain_time'] = MyTask._calc_exec_time(task_info)
        # 设置当前记录时间
        task_info['record_time'] = SysUtils.get_now_time_str()

        # 保存处理进程的历史记录
        MyTask._save_progress_history(task_info)

        # 调用 websocket task_feedback
        task_feedback(task_id, task_info)

        # 运行100%时,设置任务完成状态,并更新数据库,清理缓存
        if percent == 100.0:
            task_info['task_status'] = TaskStatus.COMPLETE
            TasksDAO.save(task_info)
            MyRedis.delete(task_id, category=task_cat)

            # 保存任务详情日志
            LogRecords.save(task_info,
                            category='task',
                            action='任务完成',
                            desc='任务执行100%,记录任务执行结果信息')
        else:
            # 缓存该任务的记录
            MyRedis.set(task_id, task_info, category=task_cat)

        # 发送执行状态的更新消息
        if notify:
            MyTask.notify_task_exec_info(task_info)

        return True
Пример #24
0
def recover_config(request):
    # 从请求中取参数:新的系统配置
    new_config_key = req_get_param(request, 'config_key')

    # 数据库中写入系统配置参数
    SystemConfig.recover_db(new_config_key)

    # 重新加载新的配置参数到缓存
    config = SystemConfig.cache_load()

    # 保存操作日志
    LogRecords.save(config,
                    category='system_config',
                    action='备份系统配置',
                    desc='备份系统各项配置参数')

    return sys_app_ok_p(config)
Пример #25
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))
Пример #26
0
def list_name(request):
    component_name = ReqParams.one(request, 'name')
    com_info = PackCOMFileDO.fetch_name(component_name)
    """ 获取源码包所有的文件统计信息 """
    # info_list = []
    # for pack in com_list:
    #     # 各个包的所含文件信息
    #     files_stat = get_sourcecode_files_stat(pack['pack_id'])
    #     pack_info = dict(pack, **files_stat)
    #     info_list.append(pack_info)

    # 保存操作日志
    LogRecords.save('',
                    category='statistics',
                    action='组件源码查询_按名称查询',
                    desc='组件源码查询_按名称查询')

    return sys_app_ok_p(com_info)
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))
Пример #28
0
def taintadd(request):
    # 从请求中取参数:文件 ID
    func_name, hazard, solution = ReqParams.many(request, ['func_name', 'hazard', 'solution'], protocol='POST')

    # find func_name in taint_dict
    if TaintdictDO.search_func_name(func_name) is None:
        print("add func_name")
        # 新的 fun ID
        fun_id = StrUtils.uuid_str()
        TaintdictDO.save(fun_id, func_name, hazard, solution)

        # 保存操作日志
        LogRecords.save('', category='statistics', action='自定义污点函数-增加',
                        desc='污点函数(ID=%s)的信息,' % fun_id)
        return sys_app_ok_p('添加成功')
    else:
        print("already has func_name")
        return sys_app_ok_p(['函数已存在'])
Пример #29
0
def list(request):
    # 所有包的基本信息
    com_list = PackCOMFileDO.all_packs()
    """ 获取源码包所有的文件统计信息 """
    info_list = []
    for pack in com_list:
        # 各个包的所含文件信息
        files_stat = get_sourcecode_files_stat(pack['pack_id'])
        pack_info = dict(pack, **files_stat)
        info_list.append(pack_info)

    # 保存操作日志
    LogRecords.save('',
                    category='statistics',
                    action='查询所有组件源码包信息',
                    desc='查询所有组件源码包的信息,统计其文件数量,查询任务信息')

    return sys_app_ok_p(info_list)
Пример #30
0
def write_sys_config(request):
    # 从请求中取参数:新的系统配置
    new_config_str = req_post_param(request, 'sys_config')
    new_config = eval(new_config_str)

    # 数据库中写入系统配置参数
    SystemConfig.write_db(new_config)

    # 重新加载新的配置参数到缓存
    config = SystemConfig.cache_load()

    # 保存操作日志
    LogRecords.save(config,
                    category='system_config',
                    action='更新系统配置',
                    desc='更新系统各项配置参数')

    return sys_app_ok_p(config)