Understanding Tool Permissions¶
Sidekick uses an AI agent that can take actions on your behalf — reading decompiled code, renaming functions, running Python scripts, issuing debugger commands. Before you hand the agent broad authority, it helps to understand exactly how those actions are controlled and what you can do to keep the agent inside boundaries you are comfortable with.
This tutorial walks you through the current permissions model, from the moment the agent asks to run a tool, through tag-based rules and per-tool overrides, to the scopes where you can save your preferences.
What happens when a tool needs approval¶
Sidekick is fail-closed by default. A tool call requires approval unless an explicit policy allows it. For user-created chats, those policies can come from the current chat, the current workspace, or the application-wide settings. For actor-owned or other system-owned processes, the runtime provides the process policy directly.
When the agent tries to use a tool that is not already allowed, the chat thread pauses and a tool call card appears in the conversation.
The card shows:
- The tool name and a summary of its arguments
- The tags associated with the tool (used for category-based rules, explained below)
- An Allow button with a dropdown arrow, and a Reject button with a dropdown arrow
Library-backed chat execution appears here as its own tool call. For example, running a Library
script from chat shows up as library_python_run, which is categorized under library.run even
though it still executes Python inside Binary Ninja.
The five actions¶
Clicking the main button performs the default action. Opening the dropdown reveals additional choices.
Allow menu:
| Action | What it does |
|---|---|
| Allow (default) | Approves this single tool call. The next call from the same tool will ask again. |
Allow all [tag] tools for this chat |
Approves the tool now and adds the tool's tag to the allow list for the current user-owned chat process only. Matching tools in that chat run without asking until the chat ends. |
Allow 'tool_name' for this chat |
Approves the tool now and adds this specific tool to the allow list for the current user-owned chat process only. |
Reject menu:
| Action | What it does |
|---|---|
| Reject (default) | Cancels the tool call and returns a rejection message to the agent. |
| Reject with Reason... | Opens a text field so you can explain why you rejected the call. The agent receives your explanation and can adjust its approach. |
Tip
"Allow for this chat" options are a good way to build momentum when you trust the current user-owned chat but are not ready to make a workspace-wide or application-wide change.
When approvals are pending only in child threads, the synthetic descendant notice in chat provides bulk actions as well: approve all pending descendant calls once, reject them all, or allow the currently pending tool types for the rest of that chat. That bulk allow action is tag-first: it adds all tags on the currently pending descendant tools to the chat policy, and falls back to tool-name allowance only for pending tools that have no tags.
Edit before approving¶
Next to the Allow and Reject buttons is an Edit button. Clicking it opens the tool call arguments as editable JSON, so you can modify parameters before the tool runs. Click Save to approve the edited call, or Cancel to go back to the original approval prompt.
Opening the Tool Permissions Settings dialog¶
To configure standing rules that apply across sessions, open the dialog from the Binary Ninja menu:
Plugins > Sidekick > Configure Tool Permissions...
Note
This menu item is disabled (greyed out) unless a binary is open and a Sidekick session is active.
The dialog has two sections stacked vertically:
- Tag-Based Permissions — a checkbox tree of tool categories
- Tool-Specific Overrides — a list of explicit per-tool rules
At the top of the dialog is a Scope selector that controls which level of settings you are editing.
Tag-based permissions¶
Every tool registered with Sidekick is assigned one or more tags when it is loaded. Tags follow a dot-separated hierarchy. A parent tag can cover an entire family of tools, without you needing to name each tool individually.
The tag hierarchy¶
The dialog is driven by the tags exposed by the tools currently registered in your environment. The table below shows common examples.
| Tag | Description | Example tools |
|---|---|---|
repo |
All repository operations | — |
repo.read |
Read files | read_file, list_files |
repo.write |
Write or create files | write_file, delete_file |
repo.manage |
Git operations (commit, checkout) | create_repo, commit |
ui |
All Binary Ninja UI operations | — |
ui.visible |
Read visible content | get_visible_content |
ui.selection |
Read the current selection | get_selection |
notebook |
All Notebook operations | — |
notebook.query |
Query notebook entries | query_notebook |
notebook.update |
Modify notebook entries and analysis context | update_notebook, update_notebook_context |
briefing |
All session briefing operations | — |
briefing.query |
Read the session briefing | get_session_briefing |
briefing.update |
Modify the session briefing | update_session_briefing |
database |
All decompilation database operations | — |
database.query |
Query the binary database | query_database |
database.update |
Modify the binary database | update_database |
index |
All index operations | — |
index.query |
Query indexes | query_indexes |
index.update |
Update indexes | update_index |
library |
All Library item tools | — |
library.run |
Run Library items in chat | library_python_run |
codemap |
All code map operations | — |
codemap.query |
Query code maps | query_code_maps |
codemap.update |
Update code maps | update_code_map |
python |
All Python tools | — |
python.binja |
Python interpreter running inside Binary Ninja | — |
python.binja.run |
Run Python scripts inside Binary Ninja | python_run, library_python_run |
python.binja.eval |
Evaluate Python expressions | python_eval |
docs |
Bundled documentation tools | search_docs, read_doc_page |
debugger |
All debugger operations | — |
debugger.control |
Control execution | debug_launch, debug_continue, debug_step |
debugger.inspection |
Inspect state | debug_inspect, debug_modules |
debugger.mutation |
Modify registers or memory | debug_write_register, debug_write_memory |
debugger.backend |
Direct backend commands | debug_backend_command |
debugger.breakpoints |
Manage breakpoints | debug_breakpoint |
system |
Internal system tools | (used by tools without another category) |
How tag state works¶
Each scope stores an explicit tri-state for tags and tools:
- Allow: tools matching that rule run without asking
- Ask: tools matching that rule always require approval
- Inherit: no explicit rule at this scope; Sidekick falls through to the next lower-precedence scope
Checking database stores an explicit Allow for the database tag. Any tool tagged database.query, database.update, or any other sub-tag under database matches that rule unless a more specific tag or tool override says otherwise.
Unlike older versions of the dialog, Sidekick does not expand a parent rule into explicit sibling rules behind the scenes. The UI shows inherited and effective state directly instead.
Note
Tags use prefix matching under the hood. A rule that allows database automatically covers any tool tagged database.query, database.update, or any other sub-tag under database.
Tool-specific overrides¶
The Tool-Specific Overrides section lets you pin a single tool to Allow (never ask) or Ask (always ask, even if its tag would otherwise allow it), regardless of what the tag tree says.
Adding an override¶
- In the tool selector dropdown at the bottom of the Tool-Specific Overrides section, type or choose a tool name. The field supports autocomplete.
- In the state dropdown next to it, choose Allow or Ask.
- Click Set.
The tool appears in the override list with its current state and its tags shown for reference.
Removing an override¶
Select the tool in the override list and click Clear. The tool reverts to whatever the tag rules say.
When overrides and tags conflict¶
An explicit tool Ask override always beats a tag allow. If database is allowed but you have added update_database as Ask, the agent will still ask before modifying your binary.
An explicit tool Allow override beats a tag set to Ask. If python.binja is set to Ask but you add python_eval as Allow, python_eval runs without asking while python_run and library_python_run still do.
The resolution order within any scope is:
- Explicit tool state
- The most specific matching tag state
- No rule at this scope — inherit to the next scope
If no scope allows the tool, the final result is Ask.
Permission scoping¶
The Scope selector at the top of the dialog determines which layer you are reading and writing. Changes in one scope do not affect the others.
| Scope | Label in UI | What it covers | When to use |
|---|---|---|---|
| This Chat | "Applies only to this chat." | The current user-owned chat process | Temporary grants for the active chat; changes are lost when the chat ends |
| This Workspace | "Applies only to this workspace." | The current Binary Ninja workspace | Per-binary or per-project rules for user-owned chats |
| All Workspaces | "Applies across all workspaces." | The live application-wide policy for user-owned chats | Global preferences that should apply everywhere immediately |
Note
For user-owned chats, scopes are consulted in order from most specific to least: This Chat, then This Workspace, then All Workspaces. If a tool is set to Ask in "This Chat" but Allow in "This Workspace", the chat-level Ask wins for that session.
Settings saved to This Workspace and All Workspaces are persisted between sessions. Settings for This Chat are always in-memory only.
Note
Actor-owned and other system-owned processes do not inherit your workspace or application settings. In the permissions dialog they appear as read-only, process-owned policies.
Recommended starting configurations¶
By default, Sidekick ships with no tags or tools in the allow list. Every tool call requires your explicit approval until you add standing rules. The configurations below are suggested starting points, not presets — you configure them manually in the dialog.
There is no single correct configuration — it depends on what you are doing and how much you trust the current task. Three starting points are described below.
Conservative: approve everything¶
Leave all tags set to Ask or Inherit and add no allow overrides. Every action the agent takes will require your explicit approval unless another scope already allows it.
This is appropriate when: - You are working with a sensitive or production binary - You are exploring what the agent does on a new binary for the first time - You want a complete audit trail of every agent action
The tradeoff is friction: multi-step analysis tasks will pause frequently waiting for your input.
Moderate: allow the reads you trust¶
Check the following tags in This Workspace scope so they apply to user-owned chats on this binary:
database.query— lets the agent read decompiled code, functions, and types without modifying themui.visibleandui.selection— let the agent see what is on screen and read the current selectionnotebook.query— lets the agent read your notesdocs— lets the agent look up Binary Ninja API documentationindex.queryandcodemap.query— lets the agent inspect indexes and code maps you have built
Leave write and mutation tags unchecked. The agent can read freely but must ask before making any change.
This configuration suits most day-to-day reverse engineering sessions. The agent can investigate the binary, reason about it, and propose actions, while you review each proposed change.
Liberal: allow most tools¶
Check all read tags as above, and additionally check:
database.update— lets the agent rename functions, add types, write commentsnotebook.update— lets the agent modify notebook entries, including outcomes and structured analysis contextindex.updateandcodemap.update— lets the agent update indexes and code mapslibrary.run— lets chat launch Library items without pausing for approvalrepo.read— lets the agent read files if you have a file repository configured
Leave the following always requiring approval:
- python.binja.run and python.binja.eval — direct Python execution can do anything the BN API allows
- debugger — all debugger controls carry significant risk
- repo.write and repo.manage — file and repository mutations are hard to reverse
This configuration suits experienced users working on CTF challenges or personal research where convenience outweighs the risk of unreviewed database edits.
Warning
Enabling database.update at the All Workspaces scope means user-owned chats can rename functions and add annotations in every binary you open without asking. Consider using This Workspace scope for write permissions so you opt in per binary.
Putting it together: a practical example¶
Suppose you are analyzing a malware sample and want the agent to survey the binary, create a Notebook summary, and propose a list of interesting functions — but you do not want it modifying anything yet.
- Open Plugins > Sidekick > Configure Tool Permissions...
- Set scope to This Workspace.
- Check:
database.query,ui.visible,ui.selection,notebook.query,docs. - Leave everything else unchecked.
- Click Close.
Now start a chat and ask Sidekick to survey the binary. The agent can read freely. When it eventually wants to write a Notebook entry summarizing its findings, it will pause and ask you — giving you a chance to review before anything is recorded.
After reviewing its summary and approving the notebook write, you can re-open the dialog and check notebook.update to let future writes go through automatically.
Next steps¶
- Chat Guide — how to direct the agent's analysis in conversation
- Notebook Guide — how Sidekick records findings
- Transaction Log Guide — reviewing what the agent changed