Open Sourced My Project Less Than 2 Weeks Ago Today I Found A Fork Where The User Stripped My License And Attribution To Claim It As Theirs
Open Sourced My Project Less Than 2 Weeks Ago Today I Found A Fork Where The User Stripped My License And Attribution To Claim It As Theirs
INTRODUCTION
You’ve poured months into building an open-source tool. You choose AGPL-3.0 to ensure derivatives remain open. Two weeks after release, you discover a fork with your LICENSE file deleted, README gutted, and your name scrubbed. This exact scenario happened with Senlo, an email builder, and it’s a systemic risk in DevOps ecosystems where infrastructure code frequently gets reused.
For DevOps engineers managing mission-critical systems, license violations aren’t academic. When someone strips attribution from your Terraform modules, Kubernetes operators, or CI/CD pipelines, they introduce legal liabilities into infrastructure-as-code repositories. Worse, they potentially create “zombie forks” – unsupported copies of your tool running in production environments without security updates.
This guide examines:
- Legal mechanics of AGPL-3.0 and other copyleft licenses
- Technical enforcement strategies using DevOps toolchains
- Automated compliance monitoring for repositories
- Real-world remediation workflows
- Ethical considerations in OSS maintainership
You’ll learn how to protect your projects while respecting community norms – crucial knowledge when your automation code becomes organizational IP.
UNDERSTANDING LICENSE COMPLIANCE IN DEVOPS
The AGPL-3.0 License Explained
AGPL-3.0 (GNU Affero General Public License) closes the “SaaS loophole” of traditional GPL by requiring network service operators to provide source code. For DevOps tools exposed via APIs/web interfaces, this has critical implications:
- Copyleft Inheritance: Any modified version must retain AGPL-3.0
- Network Use Trigger: Running the software as a networked service = distribution
- Source Provision: Users must be able to obtain corresponding source
Why Attribution Matters
Beyond legal requirements, attribution chains:
- Enable security vulnerability tracking (CVE attribution)
- Maintain audit trails in regulated industries
- Facilitate dependency updates via semantic versioning
Common Violation Patterns in Infrastructure Code
- License File Deletion: As with the Senlo case
- Metadata Obfuscation: Rewriting
go.mod/package.jsonauthorship - Copyright Misdirection: False “© 2024 Company” in Dockerfile headers
- Build Process Stripping: Removing license headers during minification
Real-World Impact Examples
- Log4j Incident: Forked versions without attribution complicated vulnerability patching
- Elasticsearch vs AWS: License changes triggered by unattributed commercialization
- Redis Commons Clause: Response to cloud providers stripping licenses
License Comparison Table
| License | Requires Attribution | Requires Derivative Disclosure | SaaS Trigger |
|---|---|---|---|
| MIT | Yes | No | No |
| Apache 2.0 | Yes | Patent clauses | No |
| GPL-3.0 | Yes | Yes | No |
| AGPL-3.0 | Yes | Yes | Yes |
| Proprietary | Varies | Varies | Varies |
PREREQUISITES FOR LICENSE ENFORCEMENT
Technical Requirements
- Version Control Systems: Git 2.30+ (supports commit signing)
- CI/CD Platforms: GitHub Actions, GitLab CI, or Jenkins
- Static Analysis Tools: FOSSology, scancode-toolkit
- Metadata Standards: SPDX identifiers in
LICENSEfiles
Legal Foundation
- Copyright registration (optional but strengthens claims)
- Contributor License Agreements (CLAs) for multi-author projects
- Documented code provenance (git blame annotations)
Pre-Installation Checklist
1
2
3
4
5
6
7
8
9
10
11
# Verify toolchain supports license checks
$ scancode --version
scancode-toolkit 32.0.2
# Confirm git commit signing capability
$ git config --get user.signingkey
A1B2C3D4E5F6G7H8
# Validate SPDX identifier in project
$ head -n 1 LICENSE
GNU AFFERO GENERAL PUBLIC LICENSE Version 3
INSTALLATION & AUTOMATED COMPLIANCE SETUP
Step 1: Configure License Scanner in CI/CD
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# .github/workflows/license-check.yml
name: License Compliance
on:
push:
branches: [ main ]
pull_request: {}
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Scan for license violations
uses: fossology/scancode-action@v2
with:
path: ./
# Fail on missing AGPL-3.0
license-score: 100
- name: Verify copyright headers
run: |
grep -rL "Copyright (c) $(date +%Y) Your Name" ./src \
&& exit 1 || exit 0
Step 2: Embed Attribution in Build Artifacts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Dockerfile attribution enforcement
FROM alpine:3.19
LABEL org.opencontainers.image.title="Senlo" \
org.opencontainers.licenses="AGPL-3.0" \
org.opencontainers.image.source="https://github.com/your/senlo"
# Embedded NOTICE file
COPY NOTICE /usr/share/senlo/NOTICE
# License validation during build
RUN if [ ! -f /usr/share/senlo/NOTICE ]; then \
echo "Build aborted: Attribution missing"; exit 1; \
fi
Step 3: Enable Tamper-Evident Releases
1
2
3
4
5
6
# Create signed SBOM
$ syft packages . -o spdx-json > sbom.spdx.json
# Attach to GitHub release
$ gh release create v1.0.0 senlo.zip --sbom sbom.spdx.json \
--verify-tag --sign
CONFIGURATION & OPTIMIZATION
Security Hardening for License Compliance
- Commit Signing Enforcement:
1 2 3 4 5
# .gitconfig [commit] gpgsign = true [tag] forceSignAnnotated = true
- Binary Attestation:
1 2
# Cosign container images $ cosign sign --key cosign.key ghcr.io/your/senlo:latest
- Read-Only License Files:
1 2 3 4
# Make LICENSE immutable $ chattr +i LICENSE $ lsattr LICENSE ----i---------e---- LICENSE
Performance Considerations
- Scanning Overhead: Parallelize scancode with
-n 8for 8 threads - Caching: Use CI/CD caching for dependency license databases
- Exclusions: Skip
node_modules/and.terraform/in scans
USAGE & OPERATIONAL MONITORING
Daily Compliance Checks
1
2
3
4
5
6
7
# Check for unattributed forks
$ gh search repos "senlo" --license=other \
--json nameWithOwner,licenseInfo | jq '.[] | select(.licenseInfo.spdxId != "AGPL-3.0")'
# Monitor Docker Hub for violations
$ regctl manifest inspect ghcr.io/unknown/senlo | \
jq '.annotations."org.opencontainers.image.licenses'
Audit Trail Management
1
2
3
4
5
6
# Generate SBOM with license info
$ syft packages . -o cyclonedx-json \
--output senlo-bom.cdx.json
# Verify signatures on release artifacts
$ cosign verify --key cosign.pub ghcr.io/your/senlo:latest
TROUBLESHOOTING COMMON ISSUES
Problem: False Positives in License Detection
Solution: Create .scancode-ignore.yml
1
2
3
4
5
# Exclude third-party components
- path: /vendor/*
reason: External dependencies
- path: /generated/*
reason: Auto-generated code
Problem: DMCA Takedown Process Complexity
Workflow:
- Document violation with
diff -u original/LICENSE fork/LICENSE - Gather git history proving ownership
- Submit through platform-specific channels:
- GitHub: Copyright Claim Form
- Docker Hub: Report Abuse
Problem: Build Failures from Strict Checks
Debugging:
1
2
3
4
5
# Check for missing headers
$ grep -L "SPDX-License-Identifier" $(find . -name '*.go')
# Verify file immutability
$ lsattr ./LICENSE
CONCLUSION
License compliance in DevOps isn’t just legal hygiene – it’s infrastructure integrity. When forks strip attribution like in the Senlo case, they potentially introduce unmaintained, insecure code into deployment pipelines. By implementing automated checks, embedding provenance data, and configuring tamper-evident builds, you protect both your work and downstream users.
Key takeaways:
- AGPL-3.0 requires active enforcement in networked services
- CI/CD-integrated scanners prevent violations before merge
- Software Bill of Materials (SBOM) creates audit trails
- Digital signatures provide cryptographic attribution proof
For further learning:
- SPDX License List
- FSF AGPL-3.0 Commentary
- OpenChain ISO 5230 Standard
- CNCF Software Due Diligence Checklist
The open-source social contract relies on mutual respect. Protect your work so others can safely build upon it.