Skip to main content

YARAAST

yaraast

Parse, analyze, and transform YARA rules with a Python AST toolkit

CI License: MIT Python 3.11-3.14

GitHub Stars GitHub Issues Docs


Overview

yaraast is a Python library for parsing and manipulating YARA-family rules using Abstract Syntax Trees (AST). It supports classic YARA, YARA-L, and YARA-X workflows with automatic dialect detection and CLI tooling.

Key Features

Feature Description
Multi-dialect Parsing Parse YARA, YARA-L, and YARA-X from files or strings
Automatic Dialect Detection Unified parser auto-detects rule dialects
AST Tooling Build, transform, diff, and serialize ASTs
Formatting & Validation CLI commands for parse/format/validate workflows
Streaming Support Parse very large files with streaming mode
Ecosystem Integrations Optional LSP and libyara-related capabilities

Supported Rule Ecosystem

Dialects   YARA, YARA-L, YARA-X
Parsers    Standard parser, unified parser, streaming parser
Outputs    YARA, JSON, YAML, AST tree views
Tooling    CLI, visitors, builders, serialization, semantic checks

Support levels differ by dialect. Classic YARA is stable, YARA-X is beta, YARA-L is experimental, and automatic dialect detection is best effort. See the compatibility matrix for the exact engines and capabilities exercised by CI.


Installation

From PyPI (Recommended)

pip install yaraast

From Source

git clone https://github.com/seifreed/yaraast.git
cd yaraast
python3 -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate
pip install -e .

Quick Start

import yaraast

yara_code = """
rule example {
    strings:
        $a = "malware" nocase
    condition:
        $a
}
"""

ast = yaraast.parse(yara_code)
print(ast.rules[0].name)

Usage

Command Line Interface

# Parse and print normalized YARA
yaraast parse rules.yar

# Parse to JSON
yaraast parse rules.yar --format json

# Parse with explicit dialect
yaraast parse rules.yar --dialect yara-x

# Validate file (syntax + parse checks)
yaraast validate rules.yar

# Format file in-place (AST-based formatter)
yaraast fmt rules.yar

# Check formatting without modifying file
yaraast fmt rules.yar --check

Core CLI Commands

Command Description
parse Parse a rule file and output YARA/JSON/YAML/tree
validate Validate rules and run validation subcommands
fmt AST-based formatter (with --check and --diff)
format Format input into a target output file
validate-syntax Syntax-focused validation entrypoint
lsp Launch Language Server Protocol features

Python Library

Unified Parsing

from pathlib import Path

import yaraast

source = "rule example { condition: true }"

# Auto-detect dialect
ast = yaraast.parse(source)

# Force specific dialect
ast = yaraast.parse(source, dialect="yara")

# Parse files, generate new source, and format canonically
Path("rules.yar").write_text(source, encoding="utf-8")
file_ast = yaraast.parse_file("rules.yar")
generated = yaraast.generate(file_ast, dialect="yara")
formatted = yaraast.format_canonical(source, dialect="yara")

# Preserve every byte outside an explicit UTF-8 byte edit
offset = source.encode("utf-8").index(b"true")
rewritten = yaraast.rewrite_lossless(
    source,
    [yaraast.SourceEdit(offset, offset + 4, "false")],
)

# Public parsers apply bounded defaults. Override them per operation when needed.
limits = yaraast.ResourceLimits(max_input_bytes=1024 * 1024, parse_deadline=5.0)
ast = yaraast.parse(source, resource_limits=limits)

cancel = yaraast.CancellationToken()
cancel.cancel()
# yaraast.parse(source, cancellation_token=cancel) raises ParseCancelledError

ResourceLimits() disables all bounds explicitly. CLI parsing uses the public defaults; LSP parsing uses tighter input, token, nesting, pattern, and deadline limits and never caches a partial result after cancellation or a limit failure.

Direct Parser + Visitor

from pathlib import Path

from yaraast.parser import Parser
from yaraast.visitor import BaseVisitor

class RuleCollector(BaseVisitor):
    def __init__(self):
        self.rules = []

    def visit_rule(self, node):
        self.rules.append(node.name)
        super().visit_rule(node)

ast = Parser(Path("rules.yar").read_text(encoding="utf-8")).parse()
collector = RuleCollector()
collector.visit(ast)
print(collector.rules)

Optional Dependencies

# LSP support
pip install yaraast[lsp]

# libyara integration
pip install yaraast[libyara]

# Performance tooling
pip install yaraast[performance]

# Visualization support
pip install yaraast[visualization]

# Everything
pip install yaraast[all]

Runtime Docs


Requirements

  • Python 3.11, 3.12, 3.13, or 3.14
  • See pyproject.toml for full dependency and extras list

Contributing

Contributions are welcome. See CONTRIBUTING.md for setup, quality checks, and workflow guidelines.

  1. Fork the repository
  2. Create a branch (git checkout -b feature/your-change)
  3. Commit changes (git commit -m "Add your change")
  4. Push (git push origin feature/your-change)
  5. Open a Pull Request

Project policy is documented in SECURITY.md, CODE_OF_CONDUCT.md, CHANGELOG.md, and MIGRATING.md.


License

This project is licensed under the MIT License - see LICENSE.

Author


Built for malware analysis and detection engineering workflows

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

yaraast-2.0.1.tar.gz (2.1 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

yaraast-2.0.1-py3-none-any.whl (849.1 kB view details)

Uploaded Python 3

File details

Details for the file yaraast-2.0.1.tar.gz.

File metadata

  • Download URL: yaraast-2.0.1.tar.gz
  • Upload date:
  • Size: 2.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for yaraast-2.0.1.tar.gz
Algorithm Hash digest
SHA256 742c5e465c539e15c8df45ae513c9482ab33a443527580e4bd0da591b2290971
MD5 72cd95a5ba4d48810eb8682a0c756409
BLAKE2b-256 76ed80f080cec1458f29fa32707c2c9c59e89d1ceb4c798bcced1d6af4035658

See more details on using hashes here.

Provenance

The following attestation bundles were made for yaraast-2.0.1.tar.gz:

Publisher: release.yml on seifreed/yaraast

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file yaraast-2.0.1-py3-none-any.whl.

File metadata

  • Download URL: yaraast-2.0.1-py3-none-any.whl
  • Upload date:
  • Size: 849.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for yaraast-2.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3e2298944a486a5ecf8060594a22e9c78ecad8f465a5aaa3c89c3446b1978815
MD5 8afad277b8b8b8348a94afba5beea4df
BLAKE2b-256 db1504b934e53ef2906acd132a00d23ba464079d98848a8f13200c4c28bc425c

See more details on using hashes here.

Provenance

The following attestation bundles were made for yaraast-2.0.1-py3-none-any.whl:

Publisher: release.yml on seifreed/yaraast

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

2.0.1 This release

2 files

1.0.1

2 files

1.0.0

2 files

0.7

2 files

0.6.1

2 files

0.6.0

2 files

0.4.0

2 files

0.3.0

2 files

0.2.0

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page