Fix (interpreter security): builtins functions passed as tools enable the use of compile, eval, exec (#274)
This commit is contained in:
		
							parent
							
								
									7a91123729
								
							
						
					
					
						commit
						a4612c98dc
					
				|  | @ -604,6 +604,8 @@ def evaluate_call( | |||
|             # cap the number of lines | ||||
|             return None | ||||
|         else:  # Assume it's a callable object | ||||
|             if (func in [eval, compile, exec]) and (func not in static_tools.values()): | ||||
|                 raise InterpreterError(f"Invoking eval, compile or exec is not allowed ({func_name}).") | ||||
|             return func(*args, **kwargs) | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -916,4 +916,37 @@ shift_intervals | |||
|         code = 'capitals = {"Czech Republic": "Prague", "Monaco": "Monaco", "Bhutan": "Thimphu"};capitals["Butan"]' | ||||
|         with pytest.raises(Exception) as e: | ||||
|             evaluate_python_code(code) | ||||
|         assert "Maybe you meant one of these indexes instead" in str(e) and "['Bhutan']" in str(e).replace("\\", "") | ||||
|         assert "Maybe you meant one of these indexes instead" in str( | ||||
|             e | ||||
|         ) and "['Bhutan']" in str(e).replace("\\", "") | ||||
| 
 | ||||
|     def test_dangerous_builtins_calls_are_blocked(self): | ||||
|         unsafe_code = "import os" | ||||
|         dangerous_code = f""" | ||||
| exec = callable.__self__.exec | ||||
| compile = callable.__self__.compile | ||||
| exec(compile('{unsafe_code}', 'no filename', 'exec')) | ||||
| """ | ||||
| 
 | ||||
|         with pytest.raises(InterpreterError): | ||||
|             evaluate_python_code(unsafe_code, static_tools=BASE_PYTHON_TOOLS) | ||||
| 
 | ||||
|         with pytest.raises(InterpreterError): | ||||
|             evaluate_python_code(dangerous_code, static_tools=BASE_PYTHON_TOOLS) | ||||
| 
 | ||||
|     def test_dangerous_builtins_are_callable_if_explicitly_added(self): | ||||
|         dangerous_code = """ | ||||
| compile = callable.__self__.compile | ||||
| eval = callable.__self__.eval | ||||
| exec = callable.__self__.exec | ||||
| 
 | ||||
| eval("1 + 1") | ||||
| exec(compile("1 + 1", "no filename", "exec")) | ||||
| 
 | ||||
| teval("1 + 1") | ||||
| texec(tcompile("1 + 1", "no filename", "exec")) | ||||
|         """ | ||||
| 
 | ||||
|         evaluate_python_code( | ||||
|             dangerous_code, static_tools={"tcompile": compile, "teval": eval, "texec": exec} | BASE_PYTHON_TOOLS | ||||
|         ) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue