ipython 9.18.0
- Source
- https://github.com/ipython/ipython
- Artifact scanned
ipython-9.18.0-py3-none-any.whl- Compared with
ipython-9.17.1-py3-none-any.whl(0 signals introduced since)- Files
- 179 scanned, 15 skipped (binary, oversized, or unrecognised)
- Signals
- 0 critical · 0 warn · 97 info
- Scan time
- 46.2 s
- LLM review
- Reviewed by claude-haiku-5-5 (Anthropic): 70 of 70 warn and critical signals; 70 demoted to info.
- Disclude version
- 4.3.0
- Scanned (UTC)
- 2026-10-30 14:28
Signals
Ordered by severity, then signals introduced in this release. Hidden characters are shown as ⟨U+…⟩.
-
=likely benign Compiles interactive cell source with the top-level await flag.Reasoning
This is IPython's standard helper for compiling cell source with the top-level-await flag. The compile input is user cell code in an interactive shell, which is the tool's purpose, not hidden obfuscation.
-
and -in returnlikely benign Wrapper around the built-in compile that tracks compiler flags for cell execution.Reasoning
This is the compiler wrapper that IPython uses to compile cells while tracking __future__ flags. Compiling runtime source is expected in a REPL compiler module.
-
\\alpha<tab> or : -
\\GREEK SMALL LETTER ALPHA<tab> -
\\α<tab> \\alpha -
``\\GREEK SMALL LETTER ETA`` -> ``η`` 3 , or -
``\\alp`` -> ``\\alpha`` and ``\\alpha`` -> ``α`` -
``\\alp`` -> ``\\alpha`` and ``\\alpha`` -> ``α`` .. :: 8.6 -
# Try to complete a full latex symbol to unicode # \\alpha -> α return , -
= . = returnlikely benign Debugger set_trace retrieves the caller's frame via sys._getframe.Reasoning
sys._getframe().f_back is the standard way for a debugger's set_trace to locate its caller. The co-occurrence with exit/exec/eval in the same file is a generic heuristic hit on a debugger module, not anti-analysis behaviour.
-
= , = # type: ignore[misc]likely benign Debugger command evaluates user-entered expression text.Reasoning
This is the pdb-style handler that evaluates user-typed expressions at the debugger prompt, using restricted empty globals and locals. That is the intended function of the debugger.
-
= assert is not None =likely benign Debugger temporarily clears the trace function during a recursive debug session.Reasoning
sys.settrace(None) temporarily disables tracing while the recursive debugger runs, a standard pdb pattern. Nothing here is hidden or malicious.
-
=likely benign Debugger restores the saved trace function on leaving a recursive session.Reasoning
This restores the previously saved trace function after leaving a recursive debugger, which is standard pdb bookkeeping.
-
= Falselikely benign Debugger clears the trace function when quitting.Reasoning
This clears the trace function on quit in the debugger, matching pdb's own quit logic. It is legitimate tracing control.
-
likely benign Module-level set_trace helper defaults to the caller's frame.
Reasoning
This is the module-level set_trace convenience function, which defaults to the caller's frame. It is the documented debugger entry point.
-
= return Falselikely benign Compiles source in a backport helper to inspect its constants.Reasoning
This backport checks whether source contains nested code objects, which is a compile-and-inspect step in debugger support code. It does not run the code.
-
passlikely benign Syntax-check compile of an expression inside a try block.Reasoning
This is a syntax-check compile in a try/except that only tests whether an expression parses. It has no execution or hidden behaviour.
-
return Falselikely benign Executes debugged source in a closure context for expression evaluation.Reasoning
This executes user-debugged source with closure cells so that the debugger can evaluate expressions in a frame context. This is the purpose of the backport.
-
return Falselikely benign Executes compiled debugged code in the frame's namespace.Reasoning
This runs the compiled code object in the debugged frame's globals with closure cells, mirroring the interpreter's exec behaviour. It is expected in a debugger backport.
-
=likely benign Debugger fallback executes user-entered statements in the current frame.Reasoning
This is the debugger's fallback exec of user-entered statements in the current frame. It is the purpose of the debugger's command line.
-
-
return =likely benign Opt-in unrestricted eval branch in IPython's guarded evaluator.Reasoning
This eval runs only when the context's evaluation mode is explicitly 'dangerous', an opt-in mode. Otherwise the module uses a restricted AST-based evaluator. The eval is intentional and gated.
-
=likely benign Editor hook launches the user-configured editor command through the shell.Reasoning
This is IPython's editor hook, which runs the user's configured editor command through the shell with the filename substituted. The shell use is a known design choice, and the command comes from local configuration, not from untrusted input. Quoting of the filename is a minor concern.
-
= =likely benign Caller frame introspection in IPython's variable-fetch helper.Reasoning
sys._getframe used to fetch caller namespaces for the %who/magic variable lookup in IPython's shell; this is standard IPython behavior, not anti-analysis. The critical severity reflects a naive heuristic pairing with exec/eval, which are core to an interactive shell.
-
=likely benign eval of user-supplied variable names in caller namespace.Reasoning
eval of a variable name against the caller's globals and locals is the intended mechanism of IPython's push/variable retrieval for user-named variables inside an interactive shell.
-
= = True =likely benign eval restricted to a literal whitelist of empty-literal tokens.Reasoning
Evaluates only a fixed whitelist of literal empty-container/string tokens ('' , "", [], {}, ()) for object info lookup; the non-literal flag is a false positive with no hostile input path.
-
""" return sys._getframe(stack_depth + 1).f_locals def run_cell_magic(self, magic_name, line, cell):likely benign Caller frame locals retrieval for shell namespace handling.Reasoning
Returns caller locals via sys._getframe(stack_depth+1) for IPython's local namespace lookup; standard shell introspection, not evasion.
-
=likely benign os.system invoked for user-typed '!' shell escapes.Reasoning
os.system with a runtime command is the purpose of IPython's '!' system-shell escape, which the user types interactively. This is expected behavior for the shell, though it is a powerful primitive.
-
= # intercept control-C; a long traceback is not useful herelikely benign Shell-enabled subprocess call for user-entered system commands.Reasoning
subprocess.call with shell=True implements IPython's system_piped escape for user-entered commands; expected interactive functionality rather than a hidden dropper.
-
= =likely benign eval of user expressions in the shell namespace.Reasoning
eval of user expression for the ev/user-expression feature (IPython's run_cell user_expressions), guarded by a bare except; intended behavior of an interactive kernel.
-
likely benign exec of user command string in the shell namespace.
Reasoning
exec of a command string in the user namespace is the core of IPython's ex/run mechanism; expected for an interpreter and not hidden or encoded.
-
returnlikely benign eval helper evaluating expressions in the user namespace.Reasoning
Returns eval of an expression in user namespaces, the documented ev() helper of the shell; no obfuscation involved.
-
= orlikely benign Compile and exec of a user-requested file.Reasoning
safe_execfile compiles and executes a file the user explicitly asked to run; standard IPython file execution.
-
awaitlikely benign Execution of compiled cell code in the shell.Reasoning
Executes compiled user cell code (async or sync) in the shell's namespaces; core interpreter behavior.
-
# Reset our crash handler in placelikely benign Synchronous exec of compiled cell code.Reasoning
Sync branch of the same cell-execution path; core interpreter functionality with no hidden payload.
-
= # This is thrown if there aren't that many frames on the stack,likely benign Caller frame retrieval with depth guard in IPython utilities.Reasoning
Caller frame lookup with a ValueError guard for shallow stacks, used by IPython's namespace-depth utilities; ordinary introspection.
-
# User namespace =likely benign eval of a user-supplied target expression in IPython's user namespace during history lookup.Reasoning
eval of a target name in the user namespace is the documented behavior of the %edit/%run-style history lookup; the user is the one typing the expression in an interactive shell.
-
: , : , : , : , -
: , : , : , : , -
: , : , : , : , -
: , : , : , : , -
: , : , : , : , -
: , : , : , : , -
: , : , : , : , -
: , : , : , : , -
: , : , : , : , -
: , : , : , : , -
: , : , : , : , -
: , : , : , : , -
: , : , : , : , -
: , : , : , : , -
: , : , : , : , -
: , : , : , : , -
: , : , : , : , -
: , : , : , : , -
# Find get_ipython() in the caller's namespace : = : | None = Nonelikely benign Uses sys._getframe to locate get_ipython in the caller's namespace.Reasoning
Reading the caller's frame to find get_ipython() is a standard IPython mechanism for locating the shell; it is not hiding behavior.
-
# inject default options at the beginning of the input line = .. =likely benign Reads the caller's code name to inject default magic options.Reasoning
Reading the caller's function name to look up default magic options is a benign introspection pattern.
-
= = returnlikely benign Lazily imports a magic function by name and caches it in module globals.Reasoning
Lazy-loading a magic by importing its module and caching the attribute in globals is a normal deferred-import pattern.
-
# print('*** args',args,'type',type(args)) # dbg =likely benign Evaluates user-supplied argument expression in the user namespace.Reasoning
The eval evaluates an expression the user typed in the %paste/%edit-style magic within their own session; this is the intended feature.
-
=likely benign exec of a config assignment built from the user's %config argument.Reasoning
exec of 'cfg.'+line builds a statement from the user's %config command line in the user's own shell. Severity is critical but the input is the interactive user's own text, so it is the expected config-magic design rather than an attack.
-
# Perform proper cleanup of the session in case iflikely benign Restores the trace function after running code under a profiler.Reasoning
sys.settrace is used to restore the tracer after profiling/debugging in %prun or similar; the co-occurrence with exec/eval is just the magic's own execution code, not anti-analysis.
-
=likely benign exec of the generated timeit inner function template.Reasoning
exec of timeit's generated template source compiled from the user's statement is the documented timeit implementation.
-
= =likely benign eval of the user's timed code in a local namespace.Reasoning
eval of user-entered code in %time/%timeit is the intended behavior of running the user's own statements.
-
= None # multi-line %%time caselikely benign exec of the user's timed statement in a local namespace.Reasoning
exec of the user's timed statement in %time is the intended purpose of the magic.
-
= = =likely benign Compiles and evals the user's timed expression.Reasoning
Compiling and evaluating the user's expression for %time output is the intended behavior.
-
# Variable in user namespace = # Search for term in history =likely benign Evaluates a user argument in the user namespace to find a variable's value.Reasoning
eval of a user-supplied variable name in the user namespace for %history search is the documented feature.
-
# tmpfile needs to be closed for windows = 1likely benign Runs the configured pager command via os.system.Reasoning
os.system on the pager command is the legitimate way IPython pages output through the user's configured pager; the command is user configuration, not attacker-supplied.
-
=likely benign Launches the configured pager through a shell.Reasoning
Popen with shell=True runs the user's configured pager command, which is the expected pager invocation in IPython's page module.
-
)likely benign Executes generated import statements to set up pylab in the user namespace.Reasoning
exec runs a string built from matplotlib/numpy import statements into the user namespace, as IPython's pylab setup does. The binascii import is incidental and the snippet shows no decoding of hidden payloads.
-
)likely benign exec of an internally built import string in pylab setup.Reasoning
The exec argument is an internally generated import string for pylab setup, the expected IPython behaviour for a magic like %pylab.
-
) # IPython symbols to addlikely benign exec of a fixed numpy import string during pylab setup.Reasoning
Same pylab setup path; the string is a fixed import line such as 'from numpy import *' plus generated text, with no external input.
-
-
info
warn→ info by reviewdecoder-import-with-execIPython/extensions/deduperreload/deduperreload.py:471:37=likely benign Compiles AST of reloaded module source for autoreload.Reasoning
The deduperreload extension compiles new AST of edited source files on autoreload. Pickle import here is not a payload decoder; the compile input is the user's own parsed source.
-
info
warn→ info by reviewdynamic-executionIPython/extensions/deduperreload/deduperreload.py:471:37=likely benign compile of reparsed module AST for hot reloading.Reasoning
compile of parsed AST from the user's own module source during autoreload is the expected mechanism.
-
info
warn→ info by reviewdynamic-executionIPython/extensions/deduperreload/deduperreload.py:474:21) # local_env contains the function exec'd from new version of functionlikely benign exec of recompiled function definitions for autoreload.Reasoning
Executes freshly compiled code of a changed function into a local env to replace the old definition, which is the extension's documented purpose.
-
info
warn→ info by reviewdynamic-executionIPython/extensions/deduperreload/deduperreload.py:506:17likely benign exec of unparsed changed definition during reload.Reasoning
Executes unparsed AST of a changed definition in the module namespace, consistent with hot reloading of source the user edited.
-
info
warn→ info by reviewdynamic-executionIPython/extensions/deduperreload/deduperreload.py:523:13: =likely benign exec of unparsed changed class definition during reload.Reasoning
Same reload mechanism applied to a class node; the source is the user's own module code.
-
= , = , ==1:likely benign Reads the caller's frame globals and locals as default namespace for a background job.Reasoning
sys._getframe(1) is used to fetch the caller's globals and locals when BackgroundJob is given no namespace, a common pattern. The critical severity is overstated; the sys.exit/exec co-occurrence is just elsewhere in the file.
-
# fail immediately if the given expression can't be compiled = =likely benign Compiles a user-supplied expression for a background job.Reasoning
BackgroundJob is a documented feature that runs a user-supplied expression in a thread. Compiling it early to fail fast is the intended design, not hidden execution.
-
returnlikely benign Evaluates the user's expression for a background job.Reasoning
eval of the precompiled user expression in a background thread is the documented purpose of the class.
-
likely benign Executes demo block source in the user namespace.
Reasoning
IPython Demo runs the source of a demo script the user chose to run, executing it in the user namespace by design.
-
= =likely benign Launches the user's configured editor command through a shell.Reasoning
shell=True is used with an editor command that comes from the user's configured editor setting, not from remote or file-embedded input. This is a risky pattern but matches the intended user-configured editor launch.
-
= # Assume its a regular float. Force 1D so we can index into it.likely benign Evaluates bracketed array text in a Sphinx doctest helper.Reasoning
eval is applied to array literal text from doctest source in the docs build, a narrow use for parsing bracketed number lists. The input is developer-written doc text.
-
""" TerminalPdb().set_trace(frame or sys._getframe().f_back)likely benign Uses the caller frame when starting the debugger trace.Reasoning
Falling back to the caller frame for set_trace is the standard debugger idiom; there is no evasion or hidden behaviour.
-
= = =likely benign Reads caller frame filename and line number to build an init location id for the embedded IPython shell.Reasoning
sys._getframe(1) is used to record the caller's file and line as a location identifier for embedded shell instances; read-only introspection with no exec or network behavior.
-
= = =likely benign Reads caller frame metadata to build a call location id for the embedded shell.Reasoning
Same benign pattern as the other embed.py finding: caller frame metadata is read to label a call location.
-
and ): = .likely benign Gets a stack frame at a given depth to pick up caller namespaces for the embedded shell.Reasoning
Uses sys._getframe with a stack depth to obtain the caller's namespaces when embedding, a standard debugging/embedding feature in IPython.
-
= =likely benign Reads the calling frame's location to initialize the embedded shell singleton.Reasoning
Reads caller frame filename and line to construct the shell instance's init location id; purely informational.
-
""" os.system("cls")likely benign Runs the fixed command 'cls' to clear the terminal screen.Reasoning
os.system with a fixed literal 'cls' is the standard Windows clear-screen command inside a %clear magic; no external input.
-
:likely benign Saves and restores the builtins '_' name around doctest execution.Reasoning
Restores or removes the builtins '_' value after doctest runs so the doctest's underscore handling does not leak; this is a scoped, restorative patch used in test tooling, not persistent malicious tampering, though it does mutate builtins.
-
"""Returns (module, locals) of the function `depth` frames away from the caller""" = = =likely benign Returns module and locals of a caller frame at a given depth.Reasoning
Frame introspection to fetch the module and locals of an ancestor frame; a documented helper for namespace lookups, no exec or network.
-
, = = =likely benign Imports a module from a dotted string name passed in by the caller.Reasoning
Dynamic import of a user-supplied dotted path is the documented purpose of import_item in IPython; it is a generic plugin/loader primitive, and the input comes from configuration by design, not from obfuscation.
-
# called with un-dotted string returnlikely benign Imports a top-level module given as a string name.Reasoning
Same import_item helper importing a top-level module by name; expected behavior for a string-based import utility.
-
== :likely benign Runs the fixed 'clear' command to clear the terminal on Unix.Reasoning
Fixed literal 'clear' command for POSIX terminal clearing; no untrusted input.
-
likely benign Runs the fixed 'cls' command to clear the terminal on Windows.
Reasoning
Fixed literal 'cls' command for Windows terminal clearing; no untrusted input.
-
= return ,likely benign Evaluates a format-string field expression against provided keyword arguments.Reasoning
eval on a format field name is part of IPython's documented EvalFormatter feature for evaluating expressions in format strings; it is intentional but does execute code from the template, so it is a real risk surface rather than hidden malice.
-
# to be formatted = # do any conversion on the resulting objectlikely benign Evaluates a format field expression within the formatter's kwargs.Reasoning
Same EvalFormatter design: field expressions from the format string are evaluated by intent; expected for this feature, not obfuscation.
Reproduce This Scan
Run disclude locally to verify. These commands scan the published file; the "new in this release" marks come from comparing it with the previous release's file, which they don't repeat. Add --format sarif for SARIF output. Add --llm (with an API key in the environment) to include the LLM review.
|