[go: nahoru, domu]

tree: b51b9e14a2c66fa8d1e608e18ec78bade46423b6 [path history] [tgz]
  1. queries/
  2. gn_sources_tools.py
  3. index_target.py
  4. OWNERS
  5. README.md
  6. targets_to_index.py
tools/codeql/README.md

CodeQL & Chromium

This directory contains:

  • scripts used for indexing CodeQL databases, and
  • sample queries designed to catch potential bugs in Chrome.

Getting Started

This guide covers how to run CodeQL queries in both VSCode and at the command line.

We strongly recommend using VSCode unless you have a specific need to use the command line. The CodeQL extension for VSCode features a lot of really nice autocomplete/fast-debug features for writing CodeQL queries that will generally make you much more productive.

We try to keep this guide up-to-date but if you run into any issues, check the official CodeQL documentation (VSCode, CLI), if that still doesn‘t help or you suspect it’s an issue specific to the database build itself, feel free to contact codeql-discuss@chromium.org.

VSCode Instructions

  1. Download a database.

    You can download recent databases at the chrome-codeql-databases GCS bucket.

    (There are a LOT of databases there. We'll prune them in the future, but for now you probably want to just filter by a date prefix, e.g. codeql-$YEAR-$MONTH-$DAY. Within the folder for a particular date, you may see more than one database. The database for Chrome always begins with chrome. You may download other databases if you like! They represent other gn targets that are used within Chrome and may be of interest to security researchers. For instance, we currently build the libavif target for those interested in inspecting that codec library specifically.)

  2. Install the VSCode CodeQL Extension

    Open the Extensions view in VSCode (ctrl+shift+X or cmd+shift+X). Search for “CodeQL” and install the official CodeQL extension.

    You should see a “QL” icon pop up at the bottom of the Activity Bar on the left-hand side of the screen once it's installed.

  3. Install CodeQL Runtimes.

    Open the Command Palette (Ctrl+Shift+P or Cmd+Shift+P).

    Type CodeQL: Download Packs and press Enter. Select “Download all core query packs.”

    Restart VSCode.

  4. Load your query files.

    Otherwise, you probably want to start with the query files in the Chromium source tree.

    In the File Explorer view, go to File > Open Folder > $YOUR_CHROME_CHECKOUT/src/tools/codeql.

    This will cause the queries to appear in the File Explorer view, AS WELL as in the CodeQL view (accessed by tapping the “QL” icon in the Activity Bar).

  5. Load the CodeQL database.

    In the CodeQL view, next to “Databases”, click “Choose Database From Archive”, then choose the zip file for the database you downloaded.

    (This import step took ~4-5 minutes on a 128-core 512GB RAM machine; and ~10 minutes on a 6-core 16GB RAM laptop.)

  6. Install pack dependencies.

    Open the Command Palette (Ctrl+Shift+P or Cmd+Shift+P). Type “Install Pack Dependencies”. Type (or select) “chrome-ql-queries”.

  7. (Optional) Load source code.

    In the CodeQL view, right-click your database and click “Add Database Source to Workspace” to make the source code for the database appear in VSCode's File Explorer. This is optional but can be useful for exploring files after the completion of a query.

  8. Run a query.

    To run one of the preexisting queries, while in the CodeQL view, right-click your chosen query (“Queries” should be listed right under “Databases”) and choose “Run against local database.”

    However, the preexisting queries are unlikely to return anything, since hopefully Chromium has already run and fixed any issues ourselves, so you may want to try writing a new query.

    To write a new query from scratch: go to the File Explorer view, add a new file with the extension .ql to the codel/queries folder, and write your query there.

    Here's a “Hello world!” style query you can try that will return methods from Mojo interface implementations in Chrome.

    import cpp
    import lib.Ipc
    
    from MojoInterfaceImpl impl
    select impl, impl.getAMethod()
    

    This query took ~5 minutes to run on a 128-core 512GB RAM machine. In general, the more complicated a query is, the more time it will take; in particular, global data flow (often required for e.g. taint tracking) will take much longer.

Command-Line Interface Instructions

  1. Install the CodeQL CLI.

    You'll want to install the most recent release from here.

  2. Download and unzip the database.

    This is identical to step 1 in the VSCode Instructions, but you will additionally unzip the database after you download it.

  3. Start writing queries.

    It‘s “choose your own adventure” from here (you might find the official CodeQL C++ docs useful), but, if you’d like a “hello world” example to play with:

    Make a directory for your queries.

    Inside that new directory, make a qlpack.yml file.

    name: my-custom-cpp-pack
    version: 0.0.0
    dependencies: codeql/cpp-all
    

    Then create a myquery.ql file inside that same directory:

    import cpp
    import lib.Ipc
    
    from MojoInterfaceImpl impl
    select impl, impl.getAMethod()
    

    Finally:

    codeql query run -d $PATH_TO_DATABASE -o output.bqrs myquery.ql

Known Issues

“There was no upgrade path to the target dbscheme”

This suggests there's a version mismatch between the CodeQL CLI used to create the database, the version of the QL libraries used by the query, and the version of the CodeQL CLI used by VSCode.

Check this issue for how to check the version of each of those things. I was able to resolve one instance of this issue by upgrading my local CLI tools version to match that used to build the Chromium database.

CodeQL: View AST “Can't infer database from the provided source”

The AST viewer seems to be broken at the moment. There's no workaround for this right now.

Other Resources