{"id":20224709,"url":"https://github.com/htrgouvea/fuzzpm","last_synced_at":"2025-04-10T16:43:09.019Z","repository":{"id":39003067,"uuid":"414787621","full_name":"htrgouvea/fuzzpm","owner":"htrgouvea","description":"Differential Fuzzer to hunt for logic bugs on Perl Modules","archived":false,"fork":false,"pushed_at":"2025-03-11T17:11:18.000Z","size":155,"stargazers_count":25,"open_issues_count":6,"forks_count":5,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-24T14:39:43.215Z","etag":null,"topics":["differential","differential-fuzzing","fuzzing"],"latest_commit_sha":null,"homepage":"https://heitorgouvea.me/2021/12/08/Differential-Fuzzing-Perl-Libs","language":"Perl","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/htrgouvea.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["htrgouvea"]}},"created_at":"2021-10-07T23:38:36.000Z","updated_at":"2025-03-11T02:11:14.000Z","dependencies_parsed_at":"2024-05-17T16:05:51.547Z","dependency_job_id":"b3fd9d13-df58-4009-a3fd-119a8bea8948","html_url":"https://github.com/htrgouvea/fuzzpm","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/htrgouvea%2Ffuzzpm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/htrgouvea%2Ffuzzpm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/htrgouvea%2Ffuzzpm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/htrgouvea%2Ffuzzpm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/htrgouvea","download_url":"https://codeload.github.com/htrgouvea/fuzzpm/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248252726,"owners_count":21072703,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["differential","differential-fuzzing","fuzzing"],"created_at":"2024-11-14T07:08:53.228Z","updated_at":"2025-04-10T16:43:08.984Z","avatar_url":"https://github.com/htrgouvea.png","language":"Perl","funding_links":["https://github.com/sponsors/htrgouvea"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ch3 align=\"center\"\u003e\u003cb\u003eFuzzPM\u003c/b\u003e\u003c/h3\u003e\n  \u003cp align=\"center\"\u003eDifferential Fuzzing for Perl Modules\u003c/p\u003e\n  \u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/htrgouvea/fuzzpm/blob/master/LICENSE.md\"\u003e\n      \u003cimg src=\"https://img.shields.io/badge/license-MIT-blue.svg\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/htrgouvea/fuzzpm/releases\"\u003e\n      \u003cimg src=\"https://img.shields.io/badge/version-0.0.4-blue.svg\"\u003e\n    \u003c/a\u003e\n    \u003cbr/\u003e\n    \u003cimg src=\"https://github.com/htrgouvea/fuzzpm/actions/workflows/linter.yml/badge.svg\"\u003e\n    \u003cimg src=\"https://github.com/htrgouvea/fuzzpm/actions/workflows/zarn.yml/badge.svg\"\u003e\n    \u003cimg src=\"https://github.com/htrgouvea/fuzzpm/actions/workflows/security-gate.yml/badge.svg\"\u003e\n    \u003cimg src=\"https://github.com/htrgouvea/fuzzpm/actions/workflows/test-on-ubuntu.yml/badge.svg\"\u003e\n  \u003c/p\u003e\n\u003c/p\u003e\n\n---\n\n### Summary\n\nThis project aims to demonstrate how we can use the differential fuzzing technique to conduct security analysis in an automated and large-scale way to find security issues in modern components used by applications developed in Perl. Full publication is avaible on: [https://heitorgouvea.me/2021/12/08/Differential-Fuzzing-Perl-Libs](https://heitorgouvea.me/2021/12/08/Differential-Fuzzing-Perl-Libs).\n\n---\n\n### Download and install\n\n```bash\n# Download\n$ git clone https://github.com/htrgouvea/fuzzpm \u0026\u0026 cd fuzzpm\n\n# Install libs and dependencies\n$ cpanm --installdeps .\n```\n\n---\n\n### How it works\n\nDifferential fuzzing is an approach where we have our seeds being sent to two or more inputs, where they are consumed and should produce the same output. At the end of the test these outputs are compared, in case of divergence the fuzzer will signal a possible failure [[1]].(https://en.wikipedia.org/wiki/Differential_testing)\n\nSo basically we have 3 components:\n\n- Our targets;\n- Input seeds;\n- Test cases;\n\nHere is a introduction about how you can create your own targets, seeds and test cases.\n\nTo create your entire fuzzing case, you first need to create your target library as a package, for example:\n\n```perl\npackage Mojo_URI {\n    use strict;\n    use warnings;\n    use Try::Tiny;\n    use Mojo::URL;\n\n    sub new {\n        my ($self, $payload) = @_;\n\n        try {\n            my $url = Mojo::URL -\u003e new($payload);\n            \n            return $url -\u003e host;\n        }\n\n        catch {\n            return undef;\n        }\n    }\n}\n```\n\nStore at: ./targets/your-taget-name.pm.\n\nSo, you need store your seeds as a file at: ./seeds/your-seeds.txt. And the last part is your case as a YAML file, follow this structure:\n\n```yaml\ntest:\n    seeds:\n        - path/to/seeds-file.txt\n    libs:\n        - First_Target\n        - Second_Target\n        - Third_Target\n```\n\nFor example, for our first case, the following YAML file was constructed and is supplied to the fuzzer via the parameter “--case”:\n\n```yaml\ntest:\n    seeds:\n        - seeds/urls-radamsa.txt\n    libs:\n        - Mojo_URI\n        - Tiny_HTTP\n        - Mojo_UA\n        - Mechanize\n        - Lib_Furl\n        - Simple_URI\n```\n\n---\n\n### Fuzzing\n\n```bash\n$ perl fuzzpm.pl --case cases/json-decode.yml\n$ perl fuzzpm.pl --case cases/parsing-url.yml\n```\n\n---\n\n### Docker container\n\n```\n$ docker build -t fuzzpm .\n$ docker run -ti --rm fuzzpm --help\n```\n\n---\n\n### Contribution\n\nYour contributions and suggestions are heartily ♥ welcome. [See here the contribution guidelines.](/.github/CONTRIBUTING.md) Please, report bugs via [issues page](https://github.com/htrgouvea/fuzzpm/issues) and for security issues, see here the [security policy.](/SECURITY.md) (✿ ◕‿◕)\n\n---\n\n### License\n\nThis work is licensed under [MIT License.](/LICENSE.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhtrgouvea%2Ffuzzpm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhtrgouvea%2Ffuzzpm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhtrgouvea%2Ffuzzpm/lists"}