Skip to content
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

.pytool/ImageValidation: Print invalid dir paths #1142

Conversation

makubacki
Copy link
Member

@makubacki makubacki commented Sep 18, 2024

Description

  • Print directory paths considered invalid to aid debugging

  • Build native OS file paths using os.path.join for walk dirs

  • Clean up trailing whitespace throughout the file

  • Impacts functionality?

  • Impacts security?

  • Breaking change?

  • Includes tests?

  • Includes documentation?

How This Was Tested

  • Local build with the plugin
  • Tested invalid directory printing by adding an invalid arch
    to TARGET_ARCH (so the directory doesn't exist in build output).

Integration Instructions

N/A - Minor tweaks

- Print directory paths considered invalid to aid debugging
- Built native OS filepaths using os.path.join for walk dirs
- Clean up trailing whitespace throughout the file

Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com>
@makubacki makubacki self-assigned this Sep 18, 2024
@github-actions github-actions bot added the impact:non-functional Does not have a functional impact label Sep 18, 2024
@makubacki makubacki changed the base branch from release/202405 to dev/202405 September 18, 2024 01:09
@codecov-commenter
Copy link

codecov-commenter commented Sep 18, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 1.59%. Comparing base (e37976a) to head (2a656fe).

Additional details and impacted files
@@             Coverage Diff             @@
##           dev/202405    #1142   +/-   ##
===========================================
  Coverage        1.59%    1.59%           
===========================================
  Files            1448     1448           
  Lines          362490   362490           
  Branches         5632     5632           
===========================================
  Hits             5776     5776           
  Misses         356607   356607           
  Partials          107      107           
Flag Coverage Δ
MdeModulePkg 0.68% <ø> (ø)
MdePkg 5.42% <ø> (ø)
NetworkPkg 0.55% <ø> (ø)
PolicyServicePkg 30.41% <ø> (ø)
UefiCpuPkg 4.73% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@makubacki makubacki merged commit 66f3d70 into microsoft:dev/202405 Sep 18, 2024
35 checks passed
makubacki added a commit to makubacki/mu_basecore that referenced this pull request Sep 23, 2024
…soft#1142)

- Print directory paths considered invalid to aid debugging
- Build native OS file paths using os.path.join for walk dirs
- Clean up trailing whitespace throughout the file

- [ ] Impacts functionality?
- [ ] Impacts security?
- [ ] Breaking change?
- [ ] Includes tests?
- [ ] Includes documentation?

- Local build with the plugin
- Tested invalid directory printing by adding an invalid arch
  to `TARGET_ARCH` (so the directory doesn't exist in build output).

N/A - Minor tweaks

Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com>
(cherry picked from commit 66f3d70)
makubacki added a commit that referenced this pull request Sep 23, 2024
- Print directory paths considered invalid to aid debugging
- Build native OS file paths using os.path.join for walk dirs
- Clean up trailing whitespace throughout the file

- [ ] Impacts functionality?
- [ ] Impacts security?
- [ ] Breaking change?
- [ ] Includes tests?
- [ ] Includes documentation?

- Local build with the plugin
- Tested invalid directory printing by adding an invalid arch
  to `TARGET_ARCH` (so the directory doesn't exist in build output).

N/A - Minor tweaks

Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com>
(cherry picked from commit 66f3d70)
ProjectMuBot referenced this pull request in microsoft/mu_tiano_platforms Sep 25, 2024
Introduces 8 new commits in [MU_BASECORE](https://github.com/microsoft/mu_basecore.git).

<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/microsoft/mu_basecore/commit/95a58f8ff1baa410405b6b0c56cb4666b7c23364">95a58f</a> [Cherry-Pick] Support Report Status Code in the UefiPxe driver.</li>
<li><a href="https://github.com/microsoft/mu_basecore/commit/ba672c3aca5c96e493fbf3628ee779388d82634b">ba672c</a> [CHERRY-PICK] MdePkg: Bring in mocks from 2311 (<a href="https://github.com/microsoft/mu_basecore/pull/1139">#1139</a>)</li>
<li><a href="https://github.com/microsoft/mu_basecore/commit/b0921a62ca99bf5ddd56a65fd2d1bb4dcb5d87ad">b0921a</a> Repo File Sync: Update PR template text and Rust version to 1.80.0 (<a href="https://github.com/microsoft/mu_basecore/pull/1135">#1135</a>)</li>
<li><a href="https://github.com/microsoft/mu_basecore/commit/a8f504e0ae2138f4b0c4b00bd0e1664b6186e444">a8f504</a> pip: bump regex from 2024.7.24 to 2024.9.11 (<a href="https://github.com/microsoft/mu_basecore/pull/1144">#1144</a>)</li>
<li><a href="https://github.com/microsoft/mu_basecore/commit/5724e5f736815eaa8430ea19f7b13bf6f383a01d">5724e5</a> pip: update edk2-pytool-library requirement from ~=0.21.10 to ~=0.21.11 (<a href="https://github.com/microsoft/mu_basecore/pull/1143">#1143</a>)</li>
<li><a href="https://github.com/microsoft/mu_basecore/commit/d857e20486701750a011dbd15f65597495728ea7">d857e2</a> [CHERRY-PICK] .pytool/ImageValidation: Print invalid dir paths (<a href="https://github.com/microsoft/mu_basecore/pull/1142">#1142</a>)</li>
<li><a href="https://github.com/microsoft/mu_basecore/commit/85f493899fc73171f84782747da2d6e3b9ebfb65">85f493</a> [SQUASH ON REBASE] ImageValidation.py: Support gitignore style syntax for file exclusion (<a href="https://github.com/microsoft/mu_basecore/pull/1140">#1140</a>)</li>
<li><a href="https://github.com/microsoft/mu_basecore/commit/f2547000cccf6f8d37d730498c8f0b5a91ce8d89">f25470</a> MdeModulePkg/SMM: Initialize 'WillReturn' variable</li>
</ul>
</details>

Signed-off-by: Project Mu Bot <mubot@microsoft.com>
apop5 pushed a commit to apop5/mu_basecore that referenced this pull request Jan 2, 2025
The addition of an PE/COFF image validation build plugin that will
verify all pe images against requirements defined in the configuration
file.

This plugin only runs if a path to a config file is provided via the
command line (PE_VALIDATION_PATH) or preferably Platform hardcoded in
the PlatformBuild.py file, so that each platform can have their own
requirements.

Previously, ImageValidation was an "opt-in" plugin by setting a build
variable `PE_VALIDATION_PATH`, however with this pull request, Image
Validation will be on by default, with some default configuration that
can be changed with a custom configuration yaml file.

The default requirements are:
1. All efi binaries must not be both write and execute
2. All efi binaries must have an image base of 0x0
3. All dxe phase binaries must be 4k section aligned, with the one
exception of AARCH64 DXE_RUNTIME_DRIVERS, which must be 64k aligned.

compiled binaries that need to be opted out of, can do so by adding an
`IGNORE_LIST` in the configuration file

```json
{
  "IGNORE_LIST": ["Shell.efi", "etc"]
}
```

In previous iterations, the profile was determined by parsing the
makefile, looking for MODULE_TYPE. As each OS / tool chain may use a
different makefile type, this was not a reliable method. This updates
the plugin to read the INF for the compiled efi file to determine the
MODULE_TYPE and thus the profile.

The PE parsing functionality was modified to only parse the
headers of the image, rather than the entire image. This change is made
to improve performance and also the probability of failing to parse the
entire image. This comes after this commit
(erocarrera/pefile#365) in pefile resulted in
efi image parsing failures, breaking the build.

This commit also wraps the parsing of the image in a try-except block to
catch any exceptions that may be raised during parsing, to cleanly exit.

- Print directory paths considered invalid to aid debugging
- Build native OS file paths using os.path.join for walk dirs
- Clean up trailing whitespace throughout the file

Add gitignore style syntax for file exclusion

Contains:
- microsoft#340
- microsoft#537
- microsoft#539
- microsoft#747
- microsoft#1100
- microsoft#1127
- microsoft#1142
- microsoft#1140

Confirmed successful execution of the plugin on Windows with QemuQ35 and
Ubuntu with QemuSbsa

Validated on qemuq35 that the module type was successfully parsed.

Validated pipelines build on mu_tiano_platforms

- Local build with the plugin
- Tested invalid directory printing by adding an invalid arch
  to `TARGET_ARCH` (so the directory doesn't exist in build output).

Ensured existing syntax (filename only) continues to work. Ensured
gitignore style syntax now works.

Platforms that begin to fail this test will need to generate a
configuration yaml file, and set a stuart build variable,
`PE_VALIDATION_PATH` to it. It is suggested to do this in the Platform's
`PlatformBuild.py`.

**The Correct Integration** is to evaluate the binary and why it is not
meeting the requirements. The platform can elect to update the
compilation of the binary to meet the requirements, add or override
validation rules for certain MODULE_TYPEs, or simply add the binary to
the ignore list. Please review the Plugin's readme.md file for more
details on doing any of these things.

Co-authored-by: Michael Kubacki <michael.kubacki@microsoft.com>
apop5 pushed a commit to apop5/mu_basecore that referenced this pull request Feb 2, 2025
The addition of an PE/COFF image validation build plugin that will
verify all pe images against requirements defined in the configuration
file.

This plugin only runs if a path to a config file is provided via the
command line (PE_VALIDATION_PATH) or preferably Platform hardcoded in
the PlatformBuild.py file, so that each platform can have their own
requirements.

Previously, ImageValidation was an "opt-in" plugin by setting a build
variable `PE_VALIDATION_PATH`, however with this pull request, Image
Validation will be on by default, with some default configuration that
can be changed with a custom configuration yaml file.

The default requirements are:
1. All efi binaries must not be both write and execute
2. All efi binaries must have an image base of 0x0
3. All dxe phase binaries must be 4k section aligned, with the one
exception of AARCH64 DXE_RUNTIME_DRIVERS, which must be 64k aligned.

compiled binaries that need to be opted out of, can do so by adding an
`IGNORE_LIST` in the configuration file

```json
{
  "IGNORE_LIST": ["Shell.efi", "etc"]
}
```

In previous iterations, the profile was determined by parsing the
makefile, looking for MODULE_TYPE. As each OS / tool chain may use a
different makefile type, this was not a reliable method. This updates
the plugin to read the INF for the compiled efi file to determine the
MODULE_TYPE and thus the profile.

The PE parsing functionality was modified to only parse the
headers of the image, rather than the entire image. This change is made
to improve performance and also the probability of failing to parse the
entire image. This comes after this commit
(erocarrera/pefile#365) in pefile resulted in
efi image parsing failures, breaking the build.

This commit also wraps the parsing of the image in a try-except block to
catch any exceptions that may be raised during parsing, to cleanly exit.

- Print directory paths considered invalid to aid debugging
- Build native OS file paths using os.path.join for walk dirs
- Clean up trailing whitespace throughout the file

Add gitignore style syntax for file exclusion

Contains:
- microsoft#340
- microsoft#537
- microsoft#539
- microsoft#747
- microsoft#1100
- microsoft#1127
- microsoft#1142
- microsoft#1140

Confirmed successful execution of the plugin on Windows with QemuQ35 and
Ubuntu with QemuSbsa

Validated on qemuq35 that the module type was successfully parsed.

Validated pipelines build on mu_tiano_platforms

- Local build with the plugin
- Tested invalid directory printing by adding an invalid arch
  to `TARGET_ARCH` (so the directory doesn't exist in build output).

Ensured existing syntax (filename only) continues to work. Ensured
gitignore style syntax now works.

Platforms that begin to fail this test will need to generate a
configuration yaml file, and set a stuart build variable,
`PE_VALIDATION_PATH` to it. It is suggested to do this in the Platform's
`PlatformBuild.py`.

**The Correct Integration** is to evaluate the binary and why it is not
meeting the requirements. The platform can elect to update the
compilation of the binary to meet the requirements, add or override
validation rules for certain MODULE_TYPEs, or simply add the binary to
the ignore list. Please review the Plugin's readme.md file for more
details on doing any of these things.

Co-authored-by: Michael Kubacki <michael.kubacki@microsoft.com>
apop5 pushed a commit to apop5/mu_basecore that referenced this pull request Feb 3, 2025
The addition of an PE/COFF image validation build plugin that will
verify all pe images against requirements defined in the configuration
file.

This plugin only runs if a path to a config file is provided via the
command line (PE_VALIDATION_PATH) or preferably Platform hardcoded in
the PlatformBuild.py file, so that each platform can have their own
requirements.

Previously, ImageValidation was an "opt-in" plugin by setting a build
variable `PE_VALIDATION_PATH`, however with this pull request, Image
Validation will be on by default, with some default configuration that
can be changed with a custom configuration yaml file.

The default requirements are:
1. All efi binaries must not be both write and execute
2. All efi binaries must have an image base of 0x0
3. All dxe phase binaries must be 4k section aligned, with the one
exception of AARCH64 DXE_RUNTIME_DRIVERS, which must be 64k aligned.

compiled binaries that need to be opted out of, can do so by adding an
`IGNORE_LIST` in the configuration file

```json
{
  "IGNORE_LIST": ["Shell.efi", "etc"]
}
```

In previous iterations, the profile was determined by parsing the
makefile, looking for MODULE_TYPE. As each OS / tool chain may use a
different makefile type, this was not a reliable method. This updates
the plugin to read the INF for the compiled efi file to determine the
MODULE_TYPE and thus the profile.

The PE parsing functionality was modified to only parse the
headers of the image, rather than the entire image. This change is made
to improve performance and also the probability of failing to parse the
entire image. This comes after this commit
(erocarrera/pefile#365) in pefile resulted in
efi image parsing failures, breaking the build.

This commit also wraps the parsing of the image in a try-except block to
catch any exceptions that may be raised during parsing, to cleanly exit.

- Print directory paths considered invalid to aid debugging
- Build native OS file paths using os.path.join for walk dirs
- Clean up trailing whitespace throughout the file

Add gitignore style syntax for file exclusion

Contains:
- microsoft#340
- microsoft#537
- microsoft#539
- microsoft#747
- microsoft#1100
- microsoft#1127
- microsoft#1142
- microsoft#1140

Confirmed successful execution of the plugin on Windows with QemuQ35 and
Ubuntu with QemuSbsa

Validated on qemuq35 that the module type was successfully parsed.

Validated pipelines build on mu_tiano_platforms

- Local build with the plugin
- Tested invalid directory printing by adding an invalid arch
  to `TARGET_ARCH` (so the directory doesn't exist in build output).

Ensured existing syntax (filename only) continues to work. Ensured
gitignore style syntax now works.

Platforms that begin to fail this test will need to generate a
configuration yaml file, and set a stuart build variable,
`PE_VALIDATION_PATH` to it. It is suggested to do this in the Platform's
`PlatformBuild.py`.

**The Correct Integration** is to evaluate the binary and why it is not
meeting the requirements. The platform can elect to update the
compilation of the binary to meet the requirements, add or override
validation rules for certain MODULE_TYPEs, or simply add the binary to
the ignore list. Please review the Plugin's readme.md file for more
details on doing any of these things.

Co-authored-by: Michael Kubacki <michael.kubacki@microsoft.com>
apop5 pushed a commit that referenced this pull request Feb 3, 2025
The addition of an PE/COFF image validation build plugin that will
verify all pe images against requirements defined in the configuration
file.

This plugin only runs if a path to a config file is provided via the
command line (PE_VALIDATION_PATH) or preferably Platform hardcoded in
the PlatformBuild.py file, so that each platform can have their own
requirements.

Previously, ImageValidation was an "opt-in" plugin by setting a build
variable `PE_VALIDATION_PATH`, however with this pull request, Image
Validation will be on by default, with some default configuration that
can be changed with a custom configuration yaml file.

The default requirements are:
1. All efi binaries must not be both write and execute
2. All efi binaries must have an image base of 0x0
3. All dxe phase binaries must be 4k section aligned, with the one
exception of AARCH64 DXE_RUNTIME_DRIVERS, which must be 64k aligned.

compiled binaries that need to be opted out of, can do so by adding an
`IGNORE_LIST` in the configuration file

```json
{
  "IGNORE_LIST": ["Shell.efi", "etc"]
}
```

In previous iterations, the profile was determined by parsing the
makefile, looking for MODULE_TYPE. As each OS / tool chain may use a
different makefile type, this was not a reliable method. This updates
the plugin to read the INF for the compiled efi file to determine the
MODULE_TYPE and thus the profile.

The PE parsing functionality was modified to only parse the
headers of the image, rather than the entire image. This change is made
to improve performance and also the probability of failing to parse the
entire image. This comes after this commit
(erocarrera/pefile#365) in pefile resulted in
efi image parsing failures, breaking the build.

This commit also wraps the parsing of the image in a try-except block to
catch any exceptions that may be raised during parsing, to cleanly exit.

- Print directory paths considered invalid to aid debugging
- Build native OS file paths using os.path.join for walk dirs
- Clean up trailing whitespace throughout the file

Add gitignore style syntax for file exclusion

Contains:
- #340
- #537
- #539
- #747
- #1100
- #1127
- #1142
- #1140

Confirmed successful execution of the plugin on Windows with QemuQ35 and
Ubuntu with QemuSbsa

Validated on qemuq35 that the module type was successfully parsed.

Validated pipelines build on mu_tiano_platforms

- Local build with the plugin
- Tested invalid directory printing by adding an invalid arch
  to `TARGET_ARCH` (so the directory doesn't exist in build output).

Ensured existing syntax (filename only) continues to work. Ensured
gitignore style syntax now works.

Platforms that begin to fail this test will need to generate a
configuration yaml file, and set a stuart build variable,
`PE_VALIDATION_PATH` to it. It is suggested to do this in the Platform's
`PlatformBuild.py`.

**The Correct Integration** is to evaluate the binary and why it is not
meeting the requirements. The platform can elect to update the
compilation of the binary to meet the requirements, add or override
validation rules for certain MODULE_TYPEs, or simply add the binary to
the ignore list. Please review the Plugin's readme.md file for more
details on doing any of these things.

Co-authored-by: Michael Kubacki <michael.kubacki@microsoft.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
impact:non-functional Does not have a functional impact
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants