CN113031931A - 一种基于脚本交叉编译的Python安全扩展方法 - Google Patents
一种基于脚本交叉编译的Python安全扩展方法 Download PDFInfo
- Publication number
- CN113031931A CN113031931A CN202110239130.0A CN202110239130A CN113031931A CN 113031931 A CN113031931 A CN 113031931A CN 202110239130 A CN202110239130 A CN 202110239130A CN 113031931 A CN113031931 A CN 113031931A
- Authority
- CN
- China
- Prior art keywords
- python
- expression
- script
- program
- abstract syntax
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 43
- 230000006870 function Effects 0.000 claims abstract description 76
- 238000001914 filtration Methods 0.000 claims abstract description 13
- 230000014509 gene expression Effects 0.000 claims description 214
- 230000015654 memory Effects 0.000 claims description 32
- 238000004590 computer program Methods 0.000 claims description 11
- 238000006243 chemical reaction Methods 0.000 claims description 10
- 238000004364 calculation method Methods 0.000 claims description 6
- 238000013138 pruning Methods 0.000 claims description 6
- 230000003068 static effect Effects 0.000 claims description 6
- 238000012546 transfer Methods 0.000 claims description 6
- 238000002347 injection Methods 0.000 abstract description 3
- 239000007924 injection Substances 0.000 abstract description 3
- 239000000654 additive Substances 0.000 description 5
- 230000000996 additive effect Effects 0.000 description 5
- 150000001875 compounds Chemical class 0.000 description 5
- 230000008569 process Effects 0.000 description 5
- 238000011156 evaluation Methods 0.000 description 3
- 101000863856 Homo sapiens Shiftless antiviral inhibitor of ribosomal frameshifting protein Proteins 0.000 description 1
- 244000035744 Hura crepitans Species 0.000 description 1
- 238000013473 artificial intelligence Methods 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 230000002950 deficient Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 238000002360 preparation method Methods 0.000 description 1
- 238000004088 simulation Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
- G06F21/53—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by executing in a restricted environment, e.g. sandbox or secure virtual machine
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
Abstract
一种基于脚本交叉编译的Python安全扩展方法,包括以下步骤:定义图灵完备的脚本语言,并提供函数调用功能;在宿主程序中定义脚本语言程序安全规则;从脚本语言源程序生成抽象语法树;对生成的抽象语法树进行过滤和安全检查;从安全的抽象语法树生成Python源代码,在宿主环境中加载执行。本发明的基于脚本交叉编译的Python安全扩展方法,在Python程序运行时对用户脚本语言进行交叉编译和安全检查,生成安全的Python源代码,再注入宿主环境中运行,可以限制用户脚本可以调用的系统和应用的应用程序接口,并对调用逻辑进行安全检查,保护应用不受到注入攻击。
Description
技术领域
本发明涉及程序扩展技术领域,特别是涉及一种基于脚本交叉编译的Python安全扩展方法。
背景技术
随着Python程序设计语言的普及,许多服务器端应用,包括人工智能和科学计算应用都采用Python语言进行编写,其中大部分应用需要提供程序运行时的可扩展性,使得开发、运维人员甚至用户可以通过脚本程序调整应用逻辑,实现灵活的定制功能。
现有Python程序设计语言编写的应用运行时逻辑扩展方法通常在应用中宿主环境下直接注入并运行用户Python程序源代码,缺乏安全性,难以限制用户可调用的功能和系统应用程序接口,容易受到注入攻击。
现有Python程序扩展方法,通常包括:
1)直接注入一段用户编写的Python脚本源程序,并立即在宿主环境使用Python解释器执行,或者使用exec方法在隔离的独立Python环境中解释执行;用户脚本通过Python系统调用和库调用完成功能的灵活定制。这类方法中,用户脚本程序拥有和宿主程序相同的环境和权限,或者可以很容易获得宿主权限,从而访问宿主程序能访问的功能和系统资源,无法防范恶意或有缺陷的用户程序对宿主系统造成破坏,也无法限制用户脚本可以使用的应用程序接口和方法。
2)使用PyPy等特定Python解释器提供的操作系统级别Python沙盒,在Python应用中创建独立子进程,将输入输出和系统调用重定向到父进程,由父进程进行过滤和转发,实现脚本的沙盒化和虚拟化。该方法不适用于大量服务器端应用部署使用的Python解释器,并且在运行时对每次输入输出、系统和库函数调用增加了一层分析和和转发,降低了程序运行效率。
发明内容
为了解决现有技术存在的不足,本发明的目的在于提供一种基于脚本交叉编译的Python安全扩展方法,通过交叉编译将用户脚本源程序一次性转化为Python脚本,并在过程中分析、过滤程序的输入输出、函数调用和程序逻辑,排除不安全的代码后,在宿主程序的环境和进程中直接执行,实现Python宿主程序的安全扩展。
为实现上述目的,本发明提供的基于脚本交叉编译的Python安全扩展方法,包括以下步骤:
定义图灵完备的脚本语言,并提供函数调用功能;
在宿主程序中定义脚本语言程序安全规则;
从脚本语言源程序生成抽象语法树;
对生成的抽象语法树进行过滤和安全检查;
从安全的抽象语法树生成Python源代码,在宿主环境中加载执行。
进一步的,所述定义图灵完备的脚本语言,并提供函数调用功能的步骤,还包括,
定义OSL脚本语言的语法,并用巴克斯范式进行表达;
证明OSL脚本语言的语法的图灵完备性。
进一步的,所述证明OSL脚本语言的语法的图灵完备性的步骤,还包括,对于图灵机有限字符集,为每个字符创建一个变量;
构造一个内存允许的最大数组,表示图灵机输入输出纸带;
创建一个变量存储当前读写头位置;
创建一个变量存储当前状态编号;
用if-else条件转移代码块,判断实现所有状态转移函数;
根据当前状态编号,改变读写头位置数组变量值,并改变读写头位置。
进一步的,所述在宿主程序中定义脚本语言程序安全规则的步骤,还包括,提供定义脚本程序可调用的系统函数、库函数和自定义函数的Python函数;
创建对象数组,每个对象数据包含允许调用的函数名称字符串,以及函数的参数类型和顺序列表;
对于需要通过调用特殊Python对象方法实现的功能,提供普通函数进行调用转发,并将普通函数加入可调用函数列表中;
提供设置脚本程序允许使用的静态内存大小的函数,并将设置的大小记录在变量中。
进一步的,所述从脚本语言源程序生成抽象语法树的步骤,还包括,
用Python实现的词法分析器对OSL脚本源程序进行词法分析,并定义关键字;
定义token类别;
定义字面量token;
定义token匹配规则;
从Token序列生成抽象语法树。
进一步的,所述从Token序列生成抽象语法树的步骤,还包括,
定义抽象语法树可包含的节点类型;
所有节点继承自共同父类ASTNode,父类节点存储当前节点的源程序行号,子节点列表;
使用Python实现的语法分析器,根据文法分析抽象语法树节点,并构造抽象语法树。
进一步的,所述对生成的抽象语法树进行过滤和安全检查的步骤,还包括,
根据宿主程序记录的允许调用函数列表,对生成的抽象语法树进行遍历,对抽象语法树中所有可达的CallNode记录的函数名称和参数列表进行过滤,找出函数名称和参数个数、类型与允许调用函数列表中任何项都不匹配的CallNode节点,将这些节点及其子树删除,对抽象语法树进行剪枝;
对抽象语法树进行遍历,对所有的VarsDeclsNode和VarDeclInitNode中记录的数据类型和个数进行统计,计算出程序运行时所需的内存大小,并和宿主程序中安全规则设置的允许内存占用大小进行比较,如果超过规则允许大小,则终止程序编译,向用户报告内存申请超界错误;
对抽象语法树进行遍历,对所有涉及间接内存访问操作的节点进行索引越界检查;
对编译期可求出索引值的节点,与数组声明或赋值时设置的大小进行比较,如果索引超出数组大小,对抽象语法树进行剪枝,删除该节点及子树;
对于编译期不可求值的索引值,在索引节点上添加索引检查标志。
进一步的,所述从安全的抽象语法树生成Python源代码的步骤,还包括,
遍历抽象语法树中所有节点,对所有标识符和变量定义,根据数据类型和大小分配合适的Python变量名,生成符号表;
对每次编译的所有Python变量名使用统一的前缀;
自底向上后序遍历抽象语法树,对于每个节点,根据节点类型和子树生成结果,生成对应的Python源代码;
将生成的Python源代码,作为字符串返回给编译器调用者,在宿主程序中用exec执行。
更进一步的,所述自底向上后序遍历抽象语法树,对于每个节点,根据节点类型和子树生成结果,生成对应的Python源代码的步骤,还包括,
将NumberNode,BoolNode,StringNode,ArrayNode,ArrayAccessNode,FactorNode翻译为对应的Python表达式;
将UnaryOpNode,BinaryOpNode,CmpNode计算节点翻译为对应的Python数值和逻辑计算表达式源代码;
将CastOpNode翻译为Python强制类型转换表达式;
将AssignNode翻译为Python赋值表达式;
将SizeOfNode根据上下文翻译为Python的len语句或size语句;
将CallNode翻译为Python函数调用表达式;
将IfNode,CStyleForNode,ForNode,WhileNode分别翻译为Python条件分支、For循环、While循环的Python代码块结构。
为实现上述目的,本发明还提供一种电子设备,包括存储器和处理器,所述存储器上储存有在所述处理器上运行的计算机程序,所述处理器运行所述计算机程序时执行如上文所述的基于脚本交叉编译的Python安全扩展方法的步骤。
为实现上述目的,本发明还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序运行时执行如上文所述的基于脚本交叉编译的Python安全扩展方法的步骤。
本发明的基于脚本交叉编译的Python安全扩展方法,在Python程序运行时对用户脚本语言进行交叉编译和安全检查,生成安全的Python源代码,再注入宿主环境中运行,可以限制用户脚本可以调用的系统和应用的应用程序接口,并对调用逻辑进行安全检查,保护应用不受到注入攻击。
本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。
附图说明
附图用来提供对本发明的进一步理解,并且构成说明书的一部分,并与本发明的实施例一起,用于解释本发明,并不构成对本发明的限制。在附图中:
图1为根据本发明的基于脚本交叉编译的Python安全扩展方法流程图。
具体实施方式
以下结合附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。
图1为根据本发明的基于脚本交叉编译的Python安全扩展方法流程图,下面将参考图1,对本发明的基于脚本交叉编译的Python安全扩展方法进行详细描述。
首先,在步骤101,定义图灵完备的脚本语言(OSL),并提供函数调用功能。
本发明实施例中,定义图灵完备的脚本语言(OSL),并提供函数调用功能的步骤,包括:
1)定义脚本语言OSL的语法,并用巴克斯范式(BNF范式)进行表达;
2)证明OSL语法的图灵完备性。
本发明实施例中,OSL脚本语言的文法用扩展巴克斯范式定义如下:bool_literal:TRUE|FALSE【布尔类型:真|假】
number_literal:NUMBER【数字类型:数字】
string_literal:STRING_LITERAL【字符串类型:字符串】
constant:number_literal【常量:数字类型】
|bool_literal【布尔类型】
|string_literal【字符串类型】
primary_expression:IDENT【基本表达式:标识符】
|constant【常量】
|SIZEOF'('IDENT')'【SIZEOF'('标识符')'】
|'('assignment_expression')'【'('赋值表达式')'】
postfix_expression:primary_expression【后缀表达式:基本表达式】
|postfix_expression'['assignment_expression']'【后缀表达式'['赋值表达式']'】
|postfix_expression'(”)'【后缀表达式'(”)'】
|postfix_expression'('argument_expression_list')'【后缀表达式'('参数表达式列表')'】
argument_expression_list:assignment_expression【参数表达式列表:赋值表达式】
|argument_expression_list COMMA assignment_expression【参数表达式列表逗号 赋值表达式】
unary_expression:postfix_expression【一元表达式:后缀表达式】
|unary_operator cast_expression【一元运算符 类型转换表达式】
unary_operator:MINUS_OP【一元运算符:减法运算符】
|UMINUS_OP【加法运算符】
|NOT_OP【逻辑非运算符】
cast_expression:unary_expression【类型转换表达式:一元表达式】
|'('type_specifier')'cast_expression【'('类型标识符')'类型转换表达式】
multiplicative_expression:cast_expression【乘法表达式:类型转换表达式】
|multiplicative_expression TIMES_OP cast_expression【乘法表达式 乘法运算符 类型转换表达式】
|multiplicative_expression DIVIDE_OP cast_expression【乘法表达式 除法运算符 类型转换表达式】
|multiplicative_expression MOD_OP cast_expression【乘法表达式 求余运算符 类型转换表达式】
additive_expression:multiplicative_expression【加法表达式:乘法表达式】
|additive_expression ADD_OP multiplicative_expression【加法表达式 加法运算符 乘法表达式】
|additive_expression MINUS_OP multiplicative_expression【加法表达式 减法运算符 乘法表达式】
shift_expression:additive_expression【移位表达式:加法表达式】
|shift_expression LEFT_OP additive_expression【移位表达式 左移运算符加法表达式】
|shift_expression RIGHT_OP shift_expression【移位表达式 右移运算符 移位表达式】
relational_expression:shift_expression【关系表达式:移位表达式】
|relational_expression LT_OP shift_expression【关系表达式 小于运算符移位表达式】
|relational_expression GT_OP shift_expression【关系表达式 大于运算符移位表达式】
|relational_expression LE_OP shift_expression【关系表达式 小于等于运算符 移位表达式】
|relational_expression GE_OP shift_expression【关系表达式 大于等于运算符 移位表达式】
equality_expression:relational_expression【相等表达式:关系表达式】
|equality_expression EQ_OP relational_expression【相等表达式 相等运算符 关系表达式】
|equality_expression NE_OP relational_expression【相等表达式 不相等运算符 关系表达式】
and_expression:equality_expression【与表达式:相等表达式】
|and_expression'&'equality_expression【与表达式'&'相等表达式】
exclusive_or_expression:and_expression【异或表达式:与表达式】
|exclusive_or_expression'^'and_expression【异或表达式'^'与表达式】
inclusive_or_expression:exclusive_or_expression【同或表达式:异或表达式】
|inclusive_or_expression'|'exclusive_or_expression【同或表达式'|'异或表达式】
logical_and_expression:inclusive_or_expression【逻辑与表达式:同或表达式】
|logical_and_expression AND_OP inclusive_or_expression【逻辑与表达式逻辑与运算符同或表达式】
logical_or_expression:logical_and_expression【逻辑或表达式:逻辑与表达式】
|logical_or_expression OR_OP logical_and_expression【逻辑或表达式 逻辑或运算符 逻辑与表达式】
assignment_expression:logical_or_expression【赋值表达式:逻辑或表达式】
|postfix_expression ASSIGN_OP assignment_expression【后缀表达式 赋值运算符 赋值表达式】
|postfix_expression ADD_ASSIGN_OP assignment_expression【后缀表达式 加法赋值运算符 赋值表达式】
|postfix_expression SUB_ASSIGN_OP assignment_expression【后缀表达式 减法赋值运算符 赋值表达式】
|postfix_expression MUL_ASSIGN_OP assignment_expression【后缀表达式 乘法赋值运算符 赋值表达式】
|postfix_expression DIV_ASSIGN_OP assignment_expression【后缀表达式 除法赋值运算符 赋值表达式】
|postfix_expression MOD_ASSIGN_OP assignment_expression【后缀表达式 求余赋值运算符 赋值表达式】
statement:compound_statement【语句:复合语句】
|selection_statement【选择语句】
|expression_statement【表达式语句】
|iteration_statement【迭代语句】
|jump_statement【跳转语句】
compound_statement:'{”}'【复合语句:'{”}'】
|'{'statement_list'}'【'{'语句列表'}'】
statement_list:statement【语句列表:语句】
|statement_list statement【语句列表语句】
selection_statement:IF'('assignment_expression')'statement【选择语句:IF'('赋值表达式')'语句】
|IF'('assignment_expression')'statement ELSE statement【IF'('赋值表达式')'语句ELSE语句】
expression_statement:SEMICOLON【表达式语句:分号】
|assignment_expression SEMICOLON【赋值表达式分号】
iteration_statement:WHILE'('assignment_expression')'statement【迭代语句:WHILE'('赋值表达式')'表达式】
|FOR'('expression_statement expression_statement')'statement【FOR'('表达式语句 表达式语句')'表达式】
|FOR'('expression_statement expression_statement assignment_expression')'statement【FOR'('表达式语句 表达式语句 赋值表达式')'表达式】
jump_statement:CONTINUE SEMICOLON【跳转语句:CONTINUE分号】
|BREAK SEMICOLON【BREAK分号】
declaration:type_specifier init_declarator_list SEMICOLON【声明:类型标识符 初始声明符列表 分号】
declaration_list:declaration【声明列表:声明】
|declaration_list declaration【声明列表声明】
init_declarator_list:init_declarator【初始声明符列表:初始声明符】
|init_declarator_list COMMA init_declarator【初始声明符列表 逗号 初始声明符】
init_declarator:declarator【初始声明符:声明符】
|declarator ASSIGN_OP initializer【声明符 赋值运算符 初始化器】
declarator:IDENT【声明符:标识符】
|IDENT'[”]'【标识符'[”]'】
|IDENT'['number_literal']'【标识符'['数字字面量']'】
|'('declarator')'【'('声明符')'】
type_specifier:INT【类型标识符:整型】
|FLOAT【浮点型】
|BOOL【布尔型】
|STRING【字符串型】
initializer:assignment_expression【初始化器:赋值表达式】
|'{'initializer_list'}'【'{'初始化器列表'}'】
|'{'initializer_list COMMA'}'【'{'初始化器列表逗号'}'】
initializer_list:initializer【初始化器列表:初始化器】
|initializer_list COMMA initializer【初始化器列表 逗号 初始化器】
block:declaration_list compound_statement【代码块:声明列表 复合语句】
program:block【程序:代码块】
本发明实施例中,证明OSL语法的图灵完备性,采用OSL程序设计语言实现模拟图灵机程序,具体包括:
对于图灵机有限字符集,为每个字符创建一个变量;构造一个内存允许的最大数组,表示图灵机输入输出纸带;创建一个变量存储当前读写头位置;创建一个变量存储当前状态编号;用if-else条件转移代码块判断实现所有状态转移函数,根据当前状态编号,改变读写头位置数组变量值,并改变读写头位置。
在步骤102,在宿主程序中定义脚本语言程序安全规则。
本发明实施例中,在宿主程序中定义脚本语言程序安全规则的步骤,包括:
1)定义允许脚本程序调用的系统函数、库函数和自定义函数名称及参数列表;
2)设置脚本语言程序的分配内存的大小限制。
本发明实施例中,在宿主程序中定义脚本语言程序安全规则进一步包括:
提供定义脚本程序可调用的系统函数、库函数和自定义函数的Python函数,其中创建对象数组,每个对象数据包含允许调用的函数名称字符串,以及函数的参数类型和顺序列表;对于要通过调用特殊Python对象方法实现的功能,提供普通函数进行调用转发,并将普通函数加入可调用函数列表中;提供设置脚本程序允许使用的静态内存大小的函数,并将设置的大小记录在变量中。
在步骤103,从OSL脚本语言源程序生成抽象语法树AST。
本发明实施例中,从OSL脚本语言源程序生成抽象语法树AST的步骤,包括:
1)对脚本语言程序进行词法分析;
2)根据OSL语法对脚本语言程序进行语法分析,生成AST。
本发明实施例中,从OSL脚本源程序生成抽象语法树AST,具体包括:
用Python实现的词法分析器PLY.Lex对OSL脚本源程序进行词法分析,并定义关键字包括:
'IF','ELSE','FOR','BREAK','CONTINUE','WHILE','TRUE','FALSE','INT','FLOAT','BOOL','STRING','SIZEOF';
定义token类别包括:'逗号','分号','加法运算符','减法运算符','乘法运算符','除法运算符','求余运算符','左移运算符','右移运算符','小于运算符','小于等于运算符','大于运算符','大于等于运算符','相等运算符','不相等运算符','逻辑与运算符','逻辑或运算符','逻辑非运算符','赋值运算符','加法赋值运算符','减法赋值运算符','乘法赋值运算符','除法赋值运算符','求余赋值运算符','标识符','数字','字符串字面量','换行','注释';
定义字面量token包括:'(',')','[',']','{','}'。
定义token匹配规则如下表所示:
表1 Token匹配规则
从Token序列生成抽象语法树AST的方法,该方法包括:
定义抽象语法树可包含的节点类型,包括:NumberNode,BoolNode,StringNode,ArrayNode,ArrayAccessNode,SizeOfNode,FactorNode,UnaryOpNode,CastOpNode,BinaryOpNode,CmpNode,AssignNode,CallNode,IfNode,ForNode,CStyleForNode,WhileNode,JumpNode,VarDeclInitNode,VarDeclsNode,BlockNode,ProgramNode。
所有节点继承自共同父类ASTNode,父类节点存储当前节点的源程序行号,子节点列表等元数据。此外各类子节点额外存储的数据内容如下:
使用Python实现的语法分析器,根据文法分析AST节点,并构造AST树。文法对应的AST节点类型如下:
在步骤104,根据宿主程序定义的安全规则,对生成的AST进行过滤和安全检查,生成安全的AST。
本发明实施例中,对生成的AST进行过滤和安全检查,包括:
1)根据宿主程序定义的允许的系统函数和库函数名称和参数列表,对AST中的函数调用节点进行过滤;
2)对AST内存分配进行静态分析,计算变量占用的静态内存大小,与宿主程序定义的规则所允许的大小进行比较过滤。
本发明实施例中,对生成的AST进行过滤和安全检查,具体包括:
根据宿主程序记录的允许调用函数列表,对生成的AST进行遍历,对AST中所有可达的CallNode记录的函数名称和参数列表进行过滤,找出函数名称和参数个数、类型与允许调用函数列表中任何项都不匹配的CallNode节点,将这些节点及其子树删除,对AST进行剪枝。
对AST进行遍历,对所有的VarsDeclsNode和VarDeclInitNode中记录的数据类型和个数进行统计,计算出程序运行时所需的内存大小,并和宿主程序中安全规则设置的允许内存占用大小进行比较,如果超过规则允许大小,则终止程序编译,向用户报告内存申请超界错误。
对AST进行遍历,对所有涉及间接内存访问操作的节点(ArrayAccessNode)进行索引越界检查。对编译期可求出索引值的节点,直接与数组声明或赋值时设置的大小进行比较,如果索引超出数组大小,对AST进行剪枝,删除该节点及子树。对于编译期不可求值的索引值,在索引节点上添加索引检查标志。
在步骤105,从安全的AST生成Python源代码,在宿主环境中加载执行。
本发明实施例中,从安全的AST生成Python源代码,包括:
1)为AST中所有内存分配节点,根据大小和类型分配合适的唯一Python对象;
2)对AST进行自底向上的后序遍历,将AST节点翻译为对应的Python源代码;
3)将生成的Python源代码作为字符串在宿主程序的Python环境中加载运行。
本发明实施例中,从安全的AST生成Python源代码,具体包括:
遍历AST中所有节点,对所有标识符和变量定义,根据数据类型和大小分配合适的Python变量名,生成符号表。为了避免和宿主程序中的变量发生冲突和产生非法内存访问,对每次编译的所有Python变量名使用统一的前缀,形如__osl_var_xxxxxxxx,其中x代表8字节的随机前缀,代码生成初始阶段用伪随机数发生器生成。
自底向上后序遍历AST,对于每个节点,根据节点类型和子树生成结果,生成对应的Python源代码。将NumberNode,BoolNode,StringNode,ArrayNode,ArrayAccessNode,FactorNode翻译为对应的Python表达式;将UnaryOpNode,BinaryOpNode,CmpNode计算节点翻译为对应的Python数值和逻辑计算表达式源代码;将CastOpNode翻译为Python强制类型转换表达式;将AssignNode翻译为Python赋值表达式;将SizeOfNode根据上下文翻译为Python的len语句或size语句;将CallNode翻译为Python函数调用表达式;将IfNode,CStyleForNode,ForNode,WhileNode分别翻译为Python条件分支、For循环、While循环的Python代码块结构。
生成Python源代码后,作为字符串返回给编译器调用者,在宿主程序中用exec执行。
本发明的一个实施例中,还提供一种电子设备,包括存储器和处理器,所述存储器上储存有在所述处理器上运行的计算机程序,所述处理器运行所述计算机程序时执行如上文所述的基于脚本交叉编译的Python安全扩展方法的步骤。
本发明的一个实施例中,还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序运行时执行如上文所述的基于脚本交叉编译的Python安全扩展方法的步骤。
本发明通过交叉编译将用户脚本源程序一次性转化为Python脚本,并在过程中分析、过滤程序的输入输出、函数调用和程序逻辑,排除不安全的代码后,在宿主程序的环境和进程中直接执行,实现Python宿主程序的安全扩展。
本领域普通技术人员可以理解:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (11)
1.一种基于脚本交叉编译的Python安全扩展方法,其特征在于,包括以下步骤:
定义图灵完备的脚本语言,并提供函数调用功能;
在宿主程序中定义脚本语言程序安全规则;
从脚本语言源程序生成抽象语法树;
对生成的抽象语法树进行过滤和安全检查;
从安全的抽象语法树生成Python源代码,在宿主环境中加载执行。
2.根据权利要求1所述的基于脚本交叉编译的Python安全扩展方法,其特征在于,所述定义图灵完备的脚本语言,并提供函数调用功能的步骤,还包括,
定义OSL脚本语言的语法,并用巴克斯范式进行表达;
证明OSL脚本语言的语法的图灵完备性。
3.根据权利要求2所述的基于脚本交叉编译的Python安全扩展方法,其特征在于,所述证明OSL脚本语言的语法的图灵完备性的步骤,还包括,
对于图灵机有限字符集,为每个字符创建一个变量;
构造一个内存允许的最大数组,表示图灵机输入输出纸带;
创建一个变量存储当前读写头位置;
创建一个变量存储当前状态编号;
用if-else条件转移代码块,判断实现所有状态转移函数;
根据当前状态编号,改变读写头位置数组变量值,并改变读写头位置。
4.根据权利要求1所述的基于脚本交叉编译的Python安全扩展方法,其特征在于,所述在宿主程序中定义脚本语言程序安全规则的步骤,还包括,
提供定义脚本程序可调用的系统函数、库函数和自定义函数的Python函数;
创建对象数组,每个对象数据包含允许调用的函数名称字符串,以及函数的参数类型和顺序列表;
对于需要通过调用特殊Python对象方法实现的功能,提供普通函数进行调用转发,并将普通函数加入可调用函数列表中;
提供设置脚本程序允许使用的静态内存大小的函数,并将设置的大小记录在变量中。
5.根据权利要求1所述的基于脚本交叉编译的Python安全扩展方法,其特征在于,所述从脚本语言源程序生成抽象语法树的步骤,还包括,
用Python实现的词法分析器对OSL脚本源程序进行词法分析,并定义关键字;
定义token类别;
定义字面量token;
定义token匹配规则;
从Token序列生成抽象语法树。
6.根据权利要求1所述的基于脚本交叉编译的Python安全扩展方法,其特征在于,所述从Token序列生成抽象语法树的步骤,还包括,
定义抽象语法树可包含的节点类型;
所有节点继承自共同父类ASTNode,父类节点存储当前节点的源程序行号,子节点列表;
使用Python实现的语法分析器,根据文法分析抽象语法树节点,并构造抽象语法树。
7.根据权利要求1所述的基于脚本交叉编译的Python安全扩展方法,其特征在于,所述对生成的抽象语法树进行过滤和安全检查的步骤,还包括,
根据宿主程序记录的允许调用函数列表,对生成的抽象语法树进行遍历,对抽象语法树中所有可达的CallNode记录的函数名称和参数列表进行过滤,找出函数名称和参数个数、类型与允许调用函数列表中任何项都不匹配的CallNode节点,将这些节点及其子树删除,对抽象语法树进行剪枝;
对抽象语法树进行遍历,对所有的VarsDeclsNode和VarDeclInitNode中记录的数据类型和个数进行统计,计算出程序运行时所需的内存大小,并和宿主程序中安全规则设置的允许内存占用大小进行比较,如果超过规则允许大小,则终止程序编译,向用户报告内存申请超界错误;
对抽象语法树进行遍历,对所有涉及间接内存访问操作的节点进行索引越界检查;
对编译期可求出索引值的节点,与数组声明或赋值时设置的大小进行比较,如果索引超出数组大小,对抽象语法树进行剪枝,删除该节点及子树;
对于编译期不可求值的索引值,在索引节点上添加索引检查标志。
8.根据权利要求1所述的基于脚本交叉编译的Python安全扩展方法,其特征在于,所述从安全的抽象语法树生成Python源代码的步骤,还包括,
遍历抽象语法树中所有节点,对所有标识符和变量定义,根据数据类型和大小分配合适的Python变量名,生成符号表;
对每次编译的所有Python变量名使用统一的前缀;
自底向上后序遍历抽象语法树,对于每个节点,根据节点类型和子树生成结果,生成对应的Python源代码;
将生成的Python源代码,作为字符串返回给编译器调用者,在宿主程序中用exec执行。
9.根据权利要求8所述的基于脚本交叉编译的Python安全扩展方法,其特征在于,所述自底向上后序遍历抽象语法树,对于每个节点,根据节点类型和子树生成结果,生成对应的Python源代码的步骤,还包括,
将NumberNode, BoolNode, StringNode, ArrayNode, ArrayAccessNode,FactorNode翻译为对应的Python表达式;
将UnaryOpNode, BinaryOpNode, CmpNode计算节点翻译为对应的Python数值和逻辑计算表达式源代码;
将CastOpNode翻译为Python强制类型转换表达式;
将AssignNode翻译为Python赋值表达式;
将SizeOfNode根据上下文翻译为Python的len语句或size语句;
将CallNode翻译为Python函数调用表达式;
将IfNode, CStyleForNode, ForNode, WhileNode分别翻译为Python条件分支、For循环、While循环的 Python代码块结构。
10.一种电子设备,其特征在于,包括存储器和处理器,所述存储器上储存有在所述处理器上运行的计算机程序,所述处理器运行所述计算机程序时执行权利要求1至9任一项所述的基于脚本交叉编译的Python安全扩展方法的步骤。
11.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序运行时执行权利要求1至9任一项所述的基于脚本交叉编译的Python安全扩展方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110239130.0A CN113031931A (zh) | 2021-03-04 | 2021-03-04 | 一种基于脚本交叉编译的Python安全扩展方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110239130.0A CN113031931A (zh) | 2021-03-04 | 2021-03-04 | 一种基于脚本交叉编译的Python安全扩展方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113031931A true CN113031931A (zh) | 2021-06-25 |
Family
ID=76466654
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110239130.0A Pending CN113031931A (zh) | 2021-03-04 | 2021-03-04 | 一种基于脚本交叉编译的Python安全扩展方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113031931A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115328544A (zh) * | 2022-10-14 | 2022-11-11 | 统信软件技术有限公司 | 一种环境定制方法、计算设备及存储介质 |
CN117056941A (zh) * | 2023-10-12 | 2023-11-14 | 北京长亭科技有限公司 | 一种基于脚本语言的安全基线的运行方法和装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140282444A1 (en) * | 2013-03-15 | 2014-09-18 | ArtinSoft Corporation | Programming language transformations with abstract syntax tree extensions |
CN109445834A (zh) * | 2018-10-30 | 2019-03-08 | 北京计算机技术及应用研究所 | 基于抽象语法树的程序代码相似性快速比较方法 |
CN110870249A (zh) * | 2017-07-07 | 2020-03-06 | 区块链控股有限公司 | 用于将高级语言代码编译为区块链平台上可执行的脚本的系统和方法 |
CN111724476A (zh) * | 2020-06-29 | 2020-09-29 | 宁波市政工程建设集团股份有限公司 | 一种基于Dynamo与Python的异形桥墩快速建模方法 |
CN111858322A (zh) * | 2020-07-10 | 2020-10-30 | 中国科学技术大学 | 一种Python语言特征自动识别系统和方法 |
-
2021
- 2021-03-04 CN CN202110239130.0A patent/CN113031931A/zh active Pending
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140282444A1 (en) * | 2013-03-15 | 2014-09-18 | ArtinSoft Corporation | Programming language transformations with abstract syntax tree extensions |
CN110870249A (zh) * | 2017-07-07 | 2020-03-06 | 区块链控股有限公司 | 用于将高级语言代码编译为区块链平台上可执行的脚本的系统和方法 |
CN109445834A (zh) * | 2018-10-30 | 2019-03-08 | 北京计算机技术及应用研究所 | 基于抽象语法树的程序代码相似性快速比较方法 |
CN111724476A (zh) * | 2020-06-29 | 2020-09-29 | 宁波市政工程建设集团股份有限公司 | 一种基于Dynamo与Python的异形桥墩快速建模方法 |
CN111858322A (zh) * | 2020-07-10 | 2020-10-30 | 中国科学技术大学 | 一种Python语言特征自动识别系统和方法 |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115328544A (zh) * | 2022-10-14 | 2022-11-11 | 统信软件技术有限公司 | 一种环境定制方法、计算设备及存储介质 |
CN115328544B (zh) * | 2022-10-14 | 2023-02-28 | 统信软件技术有限公司 | 一种环境定制方法、计算设备及存储介质 |
CN117056941A (zh) * | 2023-10-12 | 2023-11-14 | 北京长亭科技有限公司 | 一种基于脚本语言的安全基线的运行方法和装置 |
CN117056941B (zh) * | 2023-10-12 | 2024-01-23 | 北京长亭科技有限公司 | 一种基于脚本语言的安全基线的运行方法和装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112100054B (zh) | 一种面向数据管控的程序静态分析方法和系统 | |
Friedman et al. | Essentials of programming languages | |
JP2007521568A (ja) | 複数の例外処理モデルの中間表現 | |
CN113031931A (zh) | 一种基于脚本交叉编译的Python安全扩展方法 | |
Vasudevan et al. | Comparative study of DSL tools | |
Wu et al. | Foundational proof checkers with small witnesses | |
CN114611074A (zh) | Solidity语言源代码混淆方法、系统、设备及存储介质 | |
Yang et al. | Lolisa: formal syntax and semantics for a subset of the Solidity programming language in mathematical tool Coq | |
Wang et al. | An empirical study of solidity language features | |
Wang | Type system for resource bounds with type-preserving compilation | |
Reis et al. | The formalization and implementation of adaptable parsing expression grammars | |
Kalleberg et al. | Fusing a transformation language with an open compiler | |
CN115168838A (zh) | 基于虚拟机安全沙箱的脚本语言运行管理方法与系统 | |
Afroozeh et al. | Operator precedence for data-dependent grammars | |
Khan et al. | On embedding a hardware description language in Isabelle/HOL | |
Yamazaki et al. | Yet Another Generating Method of Fluent Interfaces Supporting Flat-and Sub-Chaining Styles | |
Holt et al. | The Turing language report | |
Lin | Operational semantics for Featherweight Lua | |
Steimann | Containerless plurals: Separating number from type in object-oriented programming | |
Grigoryan et al. | Expert C++: Become a proficient programmer by learning coding best practices with C++ 17 and C++ 20's latest features | |
Ke et al. | Pattern Matching Based on Object Graphs | |
Kurš | Parsing for agile modeling | |
García-Garland et al. | Attribute grammars fly first-class... safer! dealing with DSL errors in type-level programming | |
Guttman et al. | The VLISP byte-code compiler | |
Sostaks et al. | The implementation of MOLA to L3 compiler |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20230710 Address after: 1203, 1205, 12th floor, No. B6 Chaowai Street, Chaoyang District, Beijing, 100020 Applicant after: AOBEN WEILAI (BEIJING) TECHNOLOGY Co.,Ltd. Address before: 314500 room 205, building 3, 1156 Gaoqiao Avenue, Gaoqiao street, Tongxiang City, Jiaxing City, Zhejiang Province Applicant before: Jiaxing Fengniao Technology Co.,Ltd. Applicant before: AOBEN WEILAI (BEIJING) TECHNOLOGY Co.,Ltd. |
|
TA01 | Transfer of patent application right |