Post

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

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:

  1. Copyleft Inheritance: Any modified version must retain AGPL-3.0
  2. Network Use Trigger: Running the software as a networked service = distribution
  3. 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

  1. License File Deletion: As with the Senlo case
  2. Metadata Obfuscation: Rewriting go.mod/package.json authorship
  3. Copyright Misdirection: False “© 2024 Company” in Dockerfile headers
  4. 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

LicenseRequires AttributionRequires Derivative DisclosureSaaS Trigger
MITYesNoNo
Apache 2.0YesPatent clausesNo
GPL-3.0YesYesNo
AGPL-3.0YesYesYes
ProprietaryVariesVariesVaries

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 LICENSE files
  1. Copyright registration (optional but strengthens claims)
  2. Contributor License Agreements (CLAs) for multi-author projects
  3. 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

  1. Commit Signing Enforcement:
    1
    2
    3
    4
    5
    
    # .gitconfig
    [commit]
      gpgsign = true
    [tag]
      forceSignAnnotated = true
    
  2. Binary Attestation:
    1
    2
    
    # Cosign container images
    $ cosign sign --key cosign.key ghcr.io/your/senlo:latest
    
  3. 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 8 for 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:

  1. Document violation with diff -u original/LICENSE fork/LICENSE
  2. Gather git history proving ownership
  3. Submit through platform-specific channels:

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:

The open-source social contract relies on mutual respect. Protect your work so others can safely build upon it.

This post is licensed under CC BY 4.0 by the author.