Skip to content

feat(misconf): add OpenTofu file extension support #8747

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 7, 2025

Conversation

jswank
Copy link
Contributor

@jswank jswank commented Apr 16, 2025

Add support for OpenTofu file extensions (.tofu and .tofu.json) to enable scanning of OpenTofu infrastructure as code files.

Description

This PR adds detection support for OpenTofu file extensions (.tofu and .tofu.json). These files are functionally identical to Terraform files but use the OpenTofu extension, allowing Trivy to scan OpenTofu infrastructure as code files.

Checklist

Before/After Example

Before

OpenTofu (.tofu) files are not recognized as infrastructure as code files.

$ trivy config /path/to/directory/with/tofu/files
2025-04-16 INFO [misconfig] Misconfiguration scanning is enabled
2025-04-16 INFO Detected config files num=0

After

OpenTofu (.tofu) files are correctly detected and scanned for security issues.

$ trivy config /path/to/directory/with/tofu/files
2025-04-16 INFO [misconfig] Misconfiguration scanning is enabled
2025-04-16 INFO [terraform scanner] Scanning root module file_path="."
2025-04-16 INFO Detected config files num=2

Add support for OpenTofu file extensions (.tofu and .tofu.json) to
enable scanning of OpenTofu infrastructure as code files.
@jswank jswank requested review from simar7 and nikpivkin as code owners April 16, 2025 17:30
@CLAassistant
Copy link

CLAassistant commented Apr 16, 2025

CLA assistant check
All committers have signed the CLA.

@CLAassistant
Copy link

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

@simar7 simar7 requested a review from Copilot April 16, 2025 21:05
Copy link
Contributor

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR adds support for OpenTofu file extensions to enable scanning of infrastructure as code files with .tofu and .tofu.json extensions.

  • Updated parser logic to recognize tofu file extensions.
  • Added test cases to confirm tofu file detection.
  • Extended detection logic to include tofu extensions in file type determination.

Reviewed Changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

File Description
pkg/iac/scanners/terraform/parser/parser.go Updated file parsing to support .tofu and .tofu.json files.
pkg/iac/detection/detect_test.go Added tests for tofu file handling with and without readers.
pkg/iac/detection/detect.go Expanded extension checking to include tofu extensions.

Copy link
Member

@simar7 simar7 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR @jswank - adding support for OpenTofu file extension would imply adding support for OpenTofu scanning as a whole. We haven't committed to doing that just yet - there is an open discussion for it #5069

Having said that, it might be time to do so since OpenTofu has been out for a some time now. There are a couple of issues that if added to OpenTofu will make it diverge from Terraform (and may require changes on our end as well) such as:

  1. opentofu/opentofu#1306
  2. opentofu/opentofu#308

cc @nikpivkin @itaysk WDYT?

@jswank
Copy link
Contributor Author

jswank commented Apr 16, 2025

Thanks for the response @simar7! It does seems like an important consideration for the project- you certainly don't want to imply support of OpenTofu-specific functionality unintentionally. Especially since some divergence in OpenTofu / Terraform capabilities has begun to occur in recent versions.

The use case I have is fairly limited: my organization has made the decision to standardize on OpenTofu and is in the process of converting existing Terraform IaC. In order to clearly signify where this conversion has happened, we are renaming .tf files to .tofu.

Would you be open to a PR which allowed for the TF (.tf vs .tofu) extension to be specified as a flag? This would simply make use of existing Terraform functionality against a differently targeted set of files, i.e. no suggestion of supporting (potentially) divergent OpenTofu features to Trivy users. Alternatively, is this something that could be reflected in documentation? Caveat emptor, YMMV, etc.

@jswank jswank changed the title feat(iac): add OpenTofu file extension support feat(terraform): add OpenTofu file extension support Apr 16, 2025
@nikpivkin
Copy link
Contributor

nikpivkin commented Apr 17, 2025

Usually, in such cases, Trivy allows customizing file patterns via the file-patterns flag. However, this flag is not applicable if the parser works with several file extensions at once, because it becomes unclear which extension is overridden.

Having said that, it might be time to do so since OpenTofu has been out for a some time now.

If we decide to support OpenTofu, we will also need to implement support for features that exist exclusively in OpenTofu, and only enable them for files with the .tofu extension.

At this point, to my understanding and unless I'm missing something, OpenTofu does not contain any changes that could affect our current scanning goals. However, if we add support for the .tofu extension now, and OpenTofu introduces new features later, it may cause errors when scanning new configurations. On the other hand, for users who use both .tf and .tofu files at the same time, scanning only .tf will look incorrect and incomplete.

@wazy
Copy link

wazy commented May 14, 2025

Usually, in such cases, Trivy allows customizing file patterns via the file-patterns flag. However, this flag is not applicable if the parser works with several file extensions at once, because it becomes unclear which extension is overridden.

Having said that, it might be time to do so since OpenTofu has been out for a some time now.

If we decide to support OpenTofu, we will also need to implement support for features that exist exclusively in OpenTofu, and only enable them for files with the .tofu extension.

At this point, to my understanding and unless I'm missing something, OpenTofu does not contain any changes that could affect our current scanning goals. However, if we add support for the .tofu extension now, and OpenTofu introduces new features later, it may cause errors when scanning new configurations. On the other hand, for users who use both .tf and .tofu files at the same time, scanning only .tf will look incorrect and incomplete.

My org is currently switching over to only .tofu files and would love to use trivy as before with .tf files so this would be great to have included. In the interim I attempted to do the following:

trivy config --file-patterns "hcl:.*.tofu" .

but am unsuccessful in getting that to work no matter what regex is used:

WARN [report] Supported files for scanner(s) not found. scanners=[misconfig]

@nikpivkin Am I missing something obvious or does that flag not work for the misconfig scanner?

@nikpivkin
Copy link
Contributor

trivy config --file-patterns "hcl:.*.tofu"

This is not a valid pattern because the first section should specify one of the following scanners. This flag works for most IaC scanners, but not for Terraform. I left a comment above with an explanation.

@nikpivkin
Copy link
Contributor

@simar7 I've left the comment. Wdyt? I think changing the filePatterns flag to allow specifying a subtype, such as terraform:hcl:.*.tofu or terraform:json:.*.json, might be unnecessary overhead since this need arises only for Terraform and so far for OpenTofu. Unlike Dockerfile, where custom extensions are common, I don't think many users will use custom extensions for Terraform.

@wazy
Copy link

wazy commented Jun 6, 2025

@simar7 I've left the comment. Wdyt? I think changing the filePatterns flag to allow specifying a subtype, such as terraform:hcl:.*.tofu or terraform:json:.*.json, might be unnecessary overhead since this need arises only for Terraform and so far for OpenTofu. Unlike Dockerfile, where custom extensions are common, I don't think many users will use custom extensions for Terraform.

How can someone use trivy for *.tofu files that contain terraform currently/now then? I can't imagine any other kind of extensions being common or needed really beyond that.

@simar7
Copy link
Member

simar7 commented Jun 7, 2025

How can someone use trivy for *.tofu files that contain terraform currently/now then?

We currently don't support OpenTofu in Trivy. This PR aims to address that.

@simar7 simar7 self-requested a review June 7, 2025 02:50
@simar7 simar7 changed the title feat(terraform): add OpenTofu file extension support feat(misconf): add OpenTofu file extension support Jun 7, 2025
Copy link
Member

@simar7 simar7 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll approve this for now and let's see if we have to support any custom / new features in OpenTofu as we go along.

@simar7 simar7 added this pull request to the merge queue Jun 7, 2025
Merged via the queue into aquasecurity:main with commit 57801d0 Jun 7, 2025
12 of 15 checks passed
@aqua-bot aqua-bot mentioned this pull request Jun 6, 2025
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Jul 5, 2025
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [mirror.gcr.io/aquasec/trivy](https://www.aquasec.com/products/trivy/) ([source](https://github.com/aquasecurity/trivy)) | minor | `0.63.0` -> `0.64.1` |

---

### Release Notes

<details>
<summary>aquasecurity/trivy (mirror.gcr.io/aquasec/trivy)</summary>

### [`v0.64.1`](https://github.com/aquasecurity/trivy/releases/tag/v0.64.1)

[Compare Source](aquasecurity/trivy@v0.64.0...v0.64.1)

#### Changelog

- [`86ee3c1`](aquasecurity/trivy@86ee3c1) release: v0.64.1 \[release/v0.64] ([#&#8203;9122](aquasecurity/trivy#9122))
- [`4e12722`](aquasecurity/trivy@4e12722) fix(misconf): skip rewriting expr if attr is nil \[backport: release/v0.64] ([#&#8203;9127](aquasecurity/trivy#9127))
- [`9a7d384`](aquasecurity/trivy@9a7d384) fix(cli): Add more non-sensitive flags to telemetry \[backport: release/v0.64] ([#&#8203;9124](aquasecurity/trivy#9124))
- [`53adfba`](aquasecurity/trivy@53adfba) fix(rootio): check full version to detect `root.io` packages \[backport: release/v0.64] ([#&#8203;9120](aquasecurity/trivy#9120))
- [`8cf1bf9`](aquasecurity/trivy@8cf1bf9) fix(alma): parse epochs from rpmqa file \[backport: release/v0.64] ([#&#8203;9119](aquasecurity/trivy#9119))

### [`v0.64.0`](https://github.com/aquasecurity/trivy/blob/HEAD/CHANGELOG.md#0640-2025-06-30)

[Compare Source](aquasecurity/trivy@v0.63.0...v0.64.0)

##### Features

- **cli:** add version constraints to annoucements ([#&#8203;9023](aquasecurity/trivy#9023)) ([19efa9f](aquasecurity/trivy@19efa9f))
- **java:** dereference all maven settings.xml env placeholders ([#&#8203;9024](aquasecurity/trivy#9024)) ([5aade69](aquasecurity/trivy@5aade69))
- **misconf:** add OpenTofu file extension support ([#&#8203;8747](aquasecurity/trivy#8747)) ([57801d0](aquasecurity/trivy@57801d0))
- **misconf:** normalize CreatedBy for buildah and legacy docker builder ([#&#8203;8953](aquasecurity/trivy#8953)) ([65e155f](aquasecurity/trivy@65e155f))
- **redhat:** Add EOL date for RHEL 10. ([#&#8203;8910](aquasecurity/trivy#8910)) ([48258a7](aquasecurity/trivy@48258a7))
- reject unsupported artifact types in remote image retrieval ([#&#8203;9052](aquasecurity/trivy#9052)) ([1e1e1b5](aquasecurity/trivy@1e1e1b5))
- **sbom:** add manufacturer field to CycloneDX tools metadata ([#&#8203;9019](aquasecurity/trivy#9019)) ([41d0f94](aquasecurity/trivy@41d0f94))
- **terraform:** add partial evaluation for policy templates ([#&#8203;8967](aquasecurity/trivy#8967)) ([a9f7dcd](aquasecurity/trivy@a9f7dcd))
- **ubuntu:** add end of life date for Ubuntu 25.04 ([#&#8203;9077](aquasecurity/trivy#9077)) ([367564a](aquasecurity/trivy@367564a))
- **ubuntu:** add eol date for 20.04-ESM ([#&#8203;8981](aquasecurity/trivy#8981)) ([87118a0](aquasecurity/trivy@87118a0))
- **vuln:** add Root.io support for container image scanning ([#&#8203;9073](aquasecurity/trivy#9073)) ([3a0ec0f](aquasecurity/trivy@3a0ec0f))

##### Bug Fixes

- Add missing version check flags ([#&#8203;8951](aquasecurity/trivy#8951)) ([ef5f8de](aquasecurity/trivy@ef5f8de))
- **cli:** add some values to the telemetry call ([#&#8203;9056](aquasecurity/trivy#9056)) ([fd2bc91](aquasecurity/trivy@fd2bc91))
- Correctly check for semver versions for trivy version check ([#&#8203;8948](aquasecurity/trivy#8948)) ([b813527](aquasecurity/trivy@b813527))
- don't show corrupted trivy-db warning for first run ([#&#8203;8991](aquasecurity/trivy#8991)) ([4ed78e3](aquasecurity/trivy@4ed78e3))
- **misconf:** .Config.User always takes precedence over USER in .History ([#&#8203;9050](aquasecurity/trivy#9050)) ([371b8cc](aquasecurity/trivy@371b8cc))
- **misconf:** correct Azure value-to-time conversion in AsTimeValue ([#&#8203;9015](aquasecurity/trivy#9015)) ([40d017b](aquasecurity/trivy@40d017b))
- **misconf:** move disabled checks filtering after analyzer scan ([#&#8203;9002](aquasecurity/trivy#9002)) ([a58c36d](aquasecurity/trivy@a58c36d))
- **misconf:** reduce log noise on incompatible check ([#&#8203;9029](aquasecurity/trivy#9029)) ([99c5151](aquasecurity/trivy@99c5151))
- **nodejs:** correctly parse `packages` array of `bun.lock` file ([#&#8203;8998](aquasecurity/trivy#8998)) ([875ec3a](aquasecurity/trivy@875ec3a))
- **report:** don't panic when report contains vulns, but doesn't contain packages for `table` format ([#&#8203;8549](aquasecurity/trivy#8549)) ([87fda76](aquasecurity/trivy@87fda76))
- **sbom:** remove unnecessary OS detection check in SBOM decoding ([#&#8203;9034](aquasecurity/trivy#9034)) ([198789a](aquasecurity/trivy@198789a))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xLjMiLCJ1cGRhdGVkSW5WZXIiOiI0MS4xLjMiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImltYWdlIl19-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/812
Co-authored-by: Renovate Bot <[email protected]>
Co-committed-by: Renovate Bot <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants