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

Add tests for the propagation of vulnerabilities within git repositories #2140

Open
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

CharlyReux
Copy link

@CharlyReux CharlyReux commented Apr 29, 2024

In relation to some research we are making about the security in the Open Source ecosystem, we investigated how vulnerabilities are propagated in repositories. While reviewing the analysis output of the propagation of vulnerability, we noticed some unexpected behaviors, as per @RomainLefeuvre 's issues.

We made a documentation of the behavior for the test of repositories that you can find below.
We followed what we interpreted from the OSV schema documentation, and we would like to know whether this documentation suits it, and more precisely whether the test cases make sense to you.

test_cases_osvdev

This PR contains the implementation of a new test class impact_git_test and a tool to facilitate the creation of git repositories programmatically, the repositories created are dummy repositories, containing empty commits.

The tests implemented test the repoanalyzer class, without using the cherry-pick detection.

@CharlyReux CharlyReux marked this pull request as ready for review May 7, 2024 14:00
@andrewpollock
Copy link
Contributor

/gcbrun

Copy link
Contributor

@andrewpollock andrewpollock left a comment

Choose a reason for hiding this comment

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

Thank you for this contribution, apologies for the slow initial review. My review is still ongoing, here's some initial feedback.

I'd like @oliverchang to also review this, as he's much more intimately familiar with the code being tested here, but I will give this my best shot along.

""" Utilitary class to create a test repository for the git tests
"""

class VulnerabilityType(Enum):
Copy link
Contributor

Choose a reason for hiding this comment

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

For future-proofing and maintenance, could you try and use osv.vulnerability_pb2 and use vulnerability_pb2.Event.DESCRIPTOR.fields_by_name to introspect into the OSV record definition code, rather than having this standalone definition that could go out of sync with what's defined in

message Event {
// The earliest version/commit where this vulnerability
// was introduced in.
string introduced = 1;
// The version/commit that this vulnerability was fixed in.
string fixed = 2;
// The limit to apply to the range.
string limit = 3;
// The last affected version.
string last_affected = 4;
}

See also https://googleapis.dev/python/protobuf/latest/google/protobuf/descriptor.html



class TestRepository:
""" Utilitary class to create a test repository for the git tests
Copy link
Contributor

Choose a reason for hiding this comment

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

Fix spelling mistake

Suggested change
""" Utilitary class to create a test repository for the git tests
""" Utility class to create a test repository for the git tests

shutil.rmtree(f"osv/testdata/test_repositories/{name}")
self.repo = pygit2.init_repository(
f"osv/testdata/test_repositories/{name}", bare=False)
#empty initial commit usefull for the creation of the repository
Copy link
Contributor

Choose a reason for hiding this comment

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

Fix spelling mistake

Suggested change
#empty initial commit usefull for the creation of the repository
#empty initial commit useful for the creation of the repository

@@ -0,0 +1,158 @@
"""test_repository"""
Copy link
Contributor

Choose a reason for hiding this comment

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

Please expand this with more details, see https://google.github.io/styleguide/pyguide.html#381-docstrings

@andrewpollock
Copy link
Contributor

I note that this introduces breakage, so that will need to be resolved (perhaps the point of this PR was drive that discussion) before this can be merged successfully...

## Refactoring – `test_repository.py `
* Make the repo generation cleaner, remove unnecessary branch that were generated 
* Use protobuf type for events

## Refactoring - `impact_git_test.py`
* Move to a template architecture 
* Remove inconsistent tests
* Support cherry picking test

Note : 
`impact.py ` has been modified to handle repository that do not support caching. We are still trying to find a solution to enable the cache for synthetic repository created with pygit2.
@CharlyReux
Copy link
Author

Thank you very much for the review, and I apologize for the delay in responding. Since the initial PR commit, we have undergone some refactoring, mainly to make the code easier to understand, implement your proposed changes, and support the cherry-pick parameter to true when using RepoAnalyzer. Additionally, we reviewed the test cases we had proposed and noticed some inconsistencies, so we made slight modifications to them.

The aim of this pr is indeed to start the discussion about the possible discrepancy in the osv.dev implementation with regard to the "Open Source Vulnerability format" specification. For a research project, we implemented a test suite of the vulnerable commit identification algorithm to test our implementation. We thought that osv.dev would benefit from the same tests.

We identified discrepancies while using OSV.dev for a research project and created associated issue :

These test cases were implemented based on our interpretation of the specification. The specification seems to be ambiguous for certain situations, such as merge propagation, multiple ranges ...

We hope that the tests we implemented, might help to make the specification less ambiguous.

osv_test_cases drawio

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.

None yet

3 participants