Giter VIP home page Giter VIP logo

legit-labs / legitify Goto Github PK

View Code? Open in Web Editor NEW
710.0 15.0 56.0 3.89 MB

Detect and remediate misconfigurations and security risks across all your GitHub and GitLab assets

Home Page: https://legitify.dev

License: Apache License 2.0

Dockerfile 0.12% Makefile 0.54% Go 75.49% Open Policy Agent 21.21% Python 1.04% JavaScript 1.60%
supply-chain-security security-scanner sdlc-security devops security devsecops ci github gitlab golang

legitify's Introduction

Build & Test Code Analysis Version Releaser Build Docs Go Report Card
Legitify Logo

Strengthen the security posture of your source-code management!
Detect and remediate misconfigurations, security and compliance issues across all your GitHub and GitLab assets with ease 🔥
by Legit Security.

Wonder what Legit Security does?

Legit Security is an application security posture management (ASPM) and software supply chain security solution.
For more information check out the comparison table

Legitify.Demo.mov

Installation

Installation is possible in several ways:

  • For macOS (or linux) using homebrew:
brew install legitify
  • You can download the latest legitify release from https://github.com/Legit-Labs/legitify/releases, each archive contains:

    • Legitify binary for the desired platform
    • Built-in policies provided by Legit Security
  • From source with the following steps:

git clone [email protected]:Legit-Labs/legitify.git
go run main.go analyze ...
gh extension install legit-labs/gh-legitify
gh legitify

CI - Legitify Custom GitHub Action

You can run legitify as part of a CI process with the legitify Custom GitHub Actions:

name: Legitify Analyze
on:
    workflow_dispatch:
    schedule:
      - cron: '0 11 * * 1-5'

jobs:
  analyze:
    runs-on: ubuntu-latest
    steps:
      - name: Legitify Action
        uses: Legit-Labs/legitify@main
        with:
          github_token: ${{ secrets.PAT_FOR_LEGITIFY }}
          ignore-policies: |
             non_admins_can_create_public_repositories
             requires_status_checks

Checkout the action file for additional parameters and configuration.

Provenance

To enhance the software supply chain security of legitify's users, as of v0.1.6, every legitify release contains a SLSA Level 3 Provenance document.
The provenance document refers to all artifacts in the release, as well as the generated docker image.
You can use SLSA framework's official verifier to verify the provenance.
Example of usage for the darwin_arm64 architecture for the v0.1.6 release:

VERSION=0.1.6
ARCH=darwin_arm64
./slsa-verifier verify-artifact --source-branch main --builder-id 'https://github.com/slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@refs/tags/v1.2.2' --source-uri "git+https://github.com/Legit-Labs/legitify" --provenance-path multiple.intoto.jsonl ./legitify_${VERSION}_${ARCH}.tar.gz

Commands

analyze

SCM_TOKEN=<your_token> legitify analyze

By default, legitify will check the policies against all your resources (organizations, repositories, members, actions). Archived repositories are skipped.

You can control which resources will be analyzed with command-line flags namespace and org:

  • --namespace (-n): will analyze policies that relate to the specified resources
  • --org: will limit the analysis to the specified GitHub organizations or GitLab group, excluding archived repositories
  • --repo: will limit the analysis to the specified GitHub repositories or GitLab projects
  • --scm: specify the source code management platform. Possible values are: github or gitlab. Defaults to github. Please note: when running on GitLab, --scm gitlab is required.
  • --enterprise: will specify which enterprises should be analyzed. Please note: in order to analyze an enterprise, an enterprise slug must be provided.
SCM_TOKEN=<your_token> legitify analyze --org org1,org2 --namespace organization,member

The above command will test organization and member policies against org1 and org2.

gpt-analysis

SCM_TOKEN=<your_token> OPENAI_TOKEN=<token> ./legitify gpt-analysis --repo org1/repo1 --org org1

GPT-3 based analysis of the security posture of the provided repository or organization.

NOTE: The repository/organization metadata is sent to openai servers.

Flags:

  • --org: will limit the analysis to the specified GitHub organizations or GitLab group
  • --repo: will limit the analysis to the specified GitHub repositories or GitLab projects
  • --scm: specify the source code management platform. Possible values are: github or gitlab. Defaults to github.
  • --token: token for the SCM (or set the SCM_TOKEN environment variable)
  • --openai-token: token for openai API (or set OPENAI_TOKEN environment variable)

Must provide either --org or --repo or both.

Generating openai token:

  1. Go to https://beta.openai.com/signup and create an openai account
  2. Under https://platform.openai.com/account/api-keys press "Create new secret key"

GitHub Action Usage

You can also run legitify as a GitHub action in your workflows, see the action_examples directory for concrete examples.

Requirements

GitHub (Cloud and Enterprise Server)

  1. To get the most out of legitify, you need to be an owner of at least one GitHub organization. Otherwise, you can still use the tool if you're an admin of at least one repository inside an organization, in which case you'll be able to see only repository-related policies results.
  2. legitify requires a GitHub personal access token (PAT) to analyze your resources successfully, which can be either provided as an argument (-t) or as an environment variable (SCM_TOKEN). The PAT needs the following scopes for full analysis:
admin:org, read:enterprise, admin:org_hook, read:org, repo, read:repo_hook

See Creating a Personal Access Token for more information.
Fine-grained personal access tokens are currently not supported.

GitHub Enterprise Server

You can run legitify against a GitHub Enterprise Server instance if you set the endpoint URL in the environment variable SERVER_URL:

export SERVER_URL="https://github.example.com/"
SCM_TOKEN=<your_token> legitify analyze --org org1,org2 --namespace organization,member

GitLab Cloud/Server

  1. As mentioned in the previous section, you need to be an owner of at least one GitLab group. Otherwise, you can still use the tool if you're an admin of at least one project inside a group, in which case you'll be able to see only project-related policies results.
  2. legitify requires a GitLab personal access token (PAT) to analyze your resources successfully, which can be either provided as an argument (-t) or as an environment variable (SCM_TOKEN). The PAT needs the following scopes for full analysis: read_api, read_user, read_repository, read_registry See Creating a Personal Access Token for more information.
    To run legitify against GitLab Cloud set the scm flag to gitlab --scm gitlab, to run against GitLab Server you need to provide also a SERVER_URL:
export SERVER_URL="https://gitlab.example.com/"
SCM_TOKEN=<your_token> legitify analyze --namespace organization --scm gitlab

NOTE 1: To ignore invalid server certificate, please pass the ignore-invalid-certificate flag

NOTE 2: For non-premium GitLab accounts some policies (such as branch protection policies) will be skipped

Namespaces

Namespaces in legitify are resources that are collected and run against the policies. Currently, the following namespaces are supported:

  1. organization - GitHub organization (or GitLab group) level policies (e.g., "Two-Factor Authentication Is Not Enforced for the Organization")
  2. actions - organization GitHub Actions policies (e.g., "GitHub Actions Runs Are Not Limited To Verified Actions")
  3. member - contributor level policies (e.g., "Stale Admin Found")
  4. repository - GitHub repository (or GitLab Project) level policies (e.g., "Code Review By At Least Two Reviewers Is Not Enforced"). Note: Archived repositories are ignored unless specified directly via the --repo argument.
  5. runner_group - runner group policies (e.g, "runner can be used by public repositories")

By default, legitify will analyze all namespaces. You can limit only to selected ones with the --namespace flag, and then a comma separated list of the selected namespaces.

Output Options

By default, legitify will output the results in a human-readable format. This includes the list of policy violations listed by severity, as well as a summary table that is sorted by namespace.

Output Formats

Using the --output-format (-f) flag, legitify supports outputting the results in the following formats:

  1. human-readable - Human-readable text (default).
  2. json - Standard JSON.
  3. sarif - SARIF format (info).

Output Schemes

Using the --output-scheme flag, legitify supports outputting the results in different grouping schemes. Note: --output-format=json must be specified to output non-default schemes.

  1. flattened - No grouping; A flat listing of the policies, each with its violations (default).
  2. group-by-namespace - Group the policies by their namespace.
  3. group-by-resource - Group the policies by their resource e.g. specific organization/repository.
  4. group-by-severity - Group the policies by their severity.

Output Destinations

  • --output-file - full path of the output file (default: no output file, prints to stdout).
  • --error-file - full path of the error logs (default: ./error.log).

Coloring

When outputting in a human-readable format, legitify support the conventional --color[=when] flag, which has the following options:

  • auto - colored output if stdout is a terminal, uncolored otherwise (default).
  • always - colored output regardless of the output destination.
  • none - uncolored output regardless of the output destination.

Misc

  • Use the --failed-only flag to filter-out passed/skipped checks from the result.
  • Use the --ignore-policies-path $PATH and provide a file with the policies you want to ignore to skip specific policies. One policy per line, e.g. no_conversation_resolution requires_status_checks ─╯

Scorecard Support - Only for GitHub server/cloud repositories

Scorecard is an OSSF's open-source project:

Scorecards is an automated tool that assesses a number of important heuristics ("checks") associated with software security and assigns each check a score of 0-10. You can use these scores to understand specific areas to improve in order to strengthen the security posture of your project. You can also assess the risks that dependencies introduce, and make informed decisions about accepting these risks, evaluating alternative solutions, or working with the maintainers to make improvements.

legitify supports running scorecard for all of the organization's repositories, enforcing score policies and showing the results using the --scorecard flag:

  • no - do not run scorecard (default).
  • yes - run scorecard and employ a policy that alerts on each repo score below 7.0.
  • verbose - run scorecard, employ a policy that alerts on each repo score below 7.0, and embed its output to legitify's output.

legitify runs the following scorecard checks:

Check Public Repository Private Repository
Security-Policy V
CII-Best-Practices V
Fuzzing V
License V
Signed-Releases V
Branch-Protection V V
Code-Review V V
Contributors V V
Dangerous-Workflow V V
Dependency-Update-Tool V V
Maintained V V
Pinned-Dependencies V V
SAST V V
Token-Permissions V V
Vulnerabilities V V
Webhooks V V

Policies

legitify comes with a set of policies for each SCM in the policies/ directory.

These policies are documented here.

Contribution

Thank you for considering contributing to Legitify! We encourage and appreciate any kind of contribution. Here are some resources to help you get started:

Support

If you have questions about legitify or need any assistance with its operation, don't hesitate to reach out. Our team is committed to providing support and ensuring a smooth experience.

Legitify vs. the Legit Security platform

If you liked Legitify, you are going to love the Legit Security Platform!

  • It automates Legitify checks for the entire environments, discovers more systems and shows all results in a simple web app to manage at scale.
  • Legit security is a complete CI/CD security solution together with Application Security Posture Management (ASPM) that covers application security end-to-end.
  • It is a SaaS platform, built for engineering, DevOps and security teams and trusted by many leading organizaitons around the world.

Below is a comfeature parison between Legitify and Legit:

Capability Legitify Legit Security Platform
Supported platforms GitHub
GitLab
ALL major SCMs (incl. Azure DevOps, Bitbucket and more)
CI/CD systems (e.g. Jenkins)
Package registries (e.g. JFrog Artifactory)
Cloud providers (e.g. AWS)
Risk detection SCM Misconfigurations only SCMs Misconfigurations
CI Misconfigurations
CD Misconfigurations
Package Registries Misconfigurations
Pipeline risks
Secrets
IaC
Security Incidents
And more...
Compliance report OSSF SCM Best Practices SSDF
SLSA
SOC2
ISO 27001
FedRAMP
And more...
Policy drifts detection Can be detected periodically though Legitify's GitHub Action Get real-time alerts when a misconfiguration is introduced
SDLC assets management - Yes
Issue & policy management - Yes
Code To Cloud context - Yes (contextualized information enables smarter prioritization)
Workspaces & product groups - Yes
Ticketing & alerting - Jira, Slack, and more
Ingest risk - Import APIs and integrations with SAST, SCA and other testing solutions
Rest APIs - Yes

To check out Legit, visit our website or directly book a demo

legitify's People

Contributors

abacchilb avatar albertollamaso avatar amith-legit avatar anderseknert avatar benjie-legit avatar chtzvt avatar dependabot[bot] avatar derekmurawsky avatar eitan-legit avatar gal-legit avatar jakubbiel avatar luigimorel avatar nadav-legit avatar neta-legit avatar noamd-legit avatar ofek-legit avatar parroty avatar petemounce avatar rajbos avatar royb-legit avatar shay-legit avatar svento avatar tal-legit avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

legitify's Issues

GHA fails with panic: runtime error: invalid memory address or nil pointer dereference

TL;DR

A simple GHA crashes with panic: runtime error: invalid memory address or nil pointer dereference.

Expected behavior

  1. The action runs successfully.
  2. A sarif report is available.

The latter point is why I am not using v0.2.6 since it appears that is not supported there. I tried, I got no report.

Observed behavior

The GHA stops with this error message:

Error: The process '/home/runner/work/_actions/Legit-Labs/legitify/main/legitify' failed with exit code 2 | stderr: panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x10[3](https://github.com/worldr/action-runner/actions/runs/5198695844/jobs/9375155007?pr=3#step:3:3)d61c]

Version

main

On which operating system are you using legitify?

Linux

Relevant log output

Legit-Labs/legitify@main
  with:
    github_token: ***
    scorecard: true
    upload_code_scanning: true
    analyze_self_only: false
    legitify_base_version: 0.2
    compile_legitify: false
Run actions/setup-node@v3
  with:
    node-version: 16
    always-auth: false
    check-latest: false
    token: ***
Found in cache @ /opt/hostedtoolcache/node/16.20.0/x64
Environment details
Run cd "$GITHUB_ACTION_PATH"
downloading legitify binary from the following release URL: https://github.com/Legit-Labs/legitify/releases/download/v0.2.6/legitify_0.2.6_linux_amd64.tar.gz
execute legitify analyze: [
  'analyze',
  '--org',
  'worldr',
  '--output-format',
  'json',
  '--output-file',
  'legitify-output.json'
]
execute legitify convert sarif: [
  'convert',
  '--input-file',
  'legitify-output.json',
  '--output-format',
  'sarif',
  '--output-file',
  'legitify-output.sarif'
]
Error: The process '/home/runner/work/_actions/Legit-Labs/legitify/main/legitify' failed with exit code 2 | stderr: panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x103d61c]

goroutine 1 [running]:
github.com/Legit-Labs/legitify/internal/outputer/formatter.ValidateOutputFormat({0x7ffc97ca1f5b, 0x5}, {0x152d50a, 0x9})
	/home/runner/work/legitify/legitify/internal/outputer/formatter/output_format.go:38 +0x5c
github.com/Legit-Labs/legitify/cmd.(*args).validateSchemeOutputOptions(0x211b460)
	/home/runner/work/legitify/legitify/cmd/common_args.go:140 +0xc5
github.com/Legit-Labs/legitify/cmd.(*args).applySchemeOutputOptions(0x0?)
	/home/runner/work/legitify/legitify/cmd/common_args.go:124 +0x1e
github.com/Legit-Labs/legitify/cmd.executeConvertCommand(0xc0004dc780?, {0x1526f55?, 0x6?, 0x6?})
	/home/runner/work/legitify/legitify/cmd/convert.go:55 +0x75
github.com/spf13/cobra.(*Command).execute(0xc0004dc780, {0xc000089620, 0x6, 0x6})
	/home/runner/go/pkg/mod/github.com/spf13/[email protected]/command.go:872 +0x694
github.com/spf13/cobra.(*Command).ExecuteC(0x2109160)
	/home/runner/go/pkg/mod/github.com/spf13/[email protected]/command.go:990 +0x3bd
github.com/spf13/cobra.(*Command).Execute(...)
	/home/runner/go/pkg/mod/github.com/spf13/[email protected]/command.go:918
github.com/Legit-Labs/legitify/cmd.Execute()
	/home/runner/work/legitify/legitify/cmd/root.go:35 +0x198
main.main()
	/home/runner/work/legitify/legitify/main.go:6 +0x17

Error: Error: The process '/home/runner/work/_actions/Legit-Labs/legitify/main/legitify' failed with exit code 2
Error: Process completed with exit code 1.

Additional information

The GHA I am using:

--
name: "Run Legitify to check GH org settings."

on:  # yamllint disable-line rule:truthy
  push:
    branches: ['main']
  pull_request:
    # The branches below must be a subset of the branches above
    branches: ['main']
  schedule:
    #       ┌───────────── minute (0 - 59)
    #       │  ┌───────────── hour (0 - 23)
    #       │  │ ┌───────────── day of the month (1 - 31)
    #       │  │ │ ┌───────────── month (1 - 12 or JAN-DEC)
    #       │  │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
    #       │  │ │ │ │
    #       │  │ │ │ │
    #       │  │ │ │ │
    #       *  * * * *
    - cron: '0 7 * * 1-5'

jobs:
  legitify-analyze:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Legitify Action
        uses: Legit-Labs/legitify@main
        with:
          github_token: ${{ secrets.LEGITIFY_PAT }}
          scorecard: true
          upload_code_scanning: true

By default only 50 repositories are analyzed

TL;DR

I used the GitHub action and it only reported issues for 50 repos.

Expected behavior

I expected a report for all the 100+ repositories in the organization.

Observed behavior

No response

Version

0.2.0

On which operating system are you using legitify?

Linux

Relevant log output

No response

Additional information

No response

upgrade GoLang to 1.19

TL;DR

Update Go to 1.19 everywhere.

Detailed design

Now that go linter supports 1.19 (https://github.com/golangci/golangci-lint/pull/3037),
There's nothing blocking us.

Additional information

No response

GitLab repository listing

TL;DR

Need to fix GitLab support for different use cases

Expected behavior

Always list everything that is possible

Observed behavior

Some use cases aren't covered

Version

v0.0.23

On which operating system are you using legitify?

Linux

Relevant log output

No response

Additional information

Need to cover the following matrix:

  • PAT of a site admin
  • the --org flag is provided
  • the --repo flag is provided

Need to make sure to list:

  • All repos for groups where the PAT is either an owner or a site admin
  • All repos for users where the PAT is either of the user or of a site admin
  • All repos where the PAT is not owner/admin of group but has sufficient permissions for the repo
    Also fix the list-repos command to be aligned to the fixed behavior of the analyze command

Docker release not working

TL;DR

running the cli through the docker release returns an error: "x509: certificate signed by unknown authority"

Expected behavior

Expecting to get results or at least not have this error.

Observed behavior

getting an error: "x509: certificate signed by unknown authority"

Version

v10.1.5

On which operating system are you using legitify?

Mac OS

Relevant log output

“x509: certificate signed by unknown authority”

Additional information

Reproduce via: docker run -e GITHUB_TOKEN= ghcr.io/legit-labs/legitify:0.1.5 list-orgs

Make clean does not clean docs

TL;DR

When you make clean it only cleans the built binary. It does not clean the autogenerated docs directories.
Further, the generated docs are not in the .gitignore file.
This is a bad combo. Ask my how I know... 🤣

Expected behavior

Make clean should clean anything that is generated by other make commands.
The .gitignore should include the transient items that are generated via other make commands, like generated docs.

Observed behavior

No response

Version

latest

On which operating system are you using legitify?

Mac OS

Relevant log output

No response

Additional information

No response

Error collecting runner groups for Org

TL;DR

I received a panic when running on an Org.

LEGITIFY_TOKEN=XXXXXX ./legitify analyze --org ORG

panic: interface conversion: interface {} is *github.ListMembersOptions, not *github.ListOptions

goroutine 133 [running]:
github.com/Legit-Labs/legitify/internal/clients/github/pagination.(*ghOptioner).Advance(0xc0005b6000?, {0x2025e00?, 0xc0002a8160?}, {0x1db9ae0?, 0xc00050c040?})
	/home/runner/work/legitify/legitify/internal/clients/github/pagination/pagination.go:19 +0x65
github.com/Legit-Labs/legitify/internal/clients/pagination.(*MappedPager[...]).Async.func1()
	/home/runner/work/legitify/legitify/internal/clients/pagination/mapper.go:51 +0xb1
created by github.com/Legit-Labs/legitify/internal/clients/pagination.(*MappedPager[...]).Async
	/home/runner/work/legitify/legitify/internal/clients/pagination/mapper.go:41 +0xee

Expected behavior

Dunno, first time I used this

Observed behavior

No response

Version

legitify version 0.2.3 commit 66094d7

On which operating system are you using legitify?

Mac OS

Relevant log output

~/legitify_0.2.3_darwin_amd64.tar ❯❯❯ cat error.log
2023/03/06 14:21:41 2023/03/06 14:21:41 Error collecting runner groups for ORG - GET https://api.github.com/orgs/ORG/actions/runner-groups: 404 Not Found []
2023/03/06 14:21:41 2023/03/06 14:21:41 Error collecting runner groups for ORG - GET https://api.github.com/orgs/ORG/actions/runner-groups: 404 Not Found []
2023/03/06 14:21:41 2023/03/06 14:21:41 Error collecting runner groups for ORG - GET https://api.github.com/orgs/ORG/actions/runner-groups: 404 Not Found []
2023/03/06 14:21:41 2023/03/06 14:21:41 BUG: closing bar actions although it is not completed. please report this issue to legitify repository.

Additional information

No response

GitHub Action

TL;DR

Prepare a GitHub action for easy integration of legitify as a periodic scanner to keep organizations/repositories secure.

Detailed design

This could be implemented as:
1. Workflow template
2. Preferably - An action that wraps legitify and runs it with the relevant parameters.

Additional information

No response

Rate limit errors

TL;DR

When legitify analyze'ing across large number of repos (in my organization, there are ~290), rate limit errors are encountered, and there is no way to slow the rate and mitigate the errors (other than reducing the number of repos in scope for analyze)

Expected behavior

Exponential backoff by default and/or allow the caller to specify a value for wait between requests

Observed behavior

Errors like this:

2023/01/12 11:09:25 2023/01/12 11:09:25 error getting branch protection info for the_repo: GET https://api.github.com/repos/TheOrg/the_repo/branches/master/protection: 403 You have exceeded a secondary rate limit. Please wait a few minutes before you try again.

which results in incomplete results in output.

Version

legitify version 0.2.1 commit a5a45e1

On which operating system are you using legitify?

Linux

Relevant log output

2023/01/12 11:09:25 2023/01/12 11:09:25 error getting branch protection info for the_repo: GET https://api.github.com/repos/TheOrg/the_repo/branches/master/protection: 403 You have exceeded a secondary rate limit. Please wait a few minutes before you try again.


### Additional information

_No response_

Incorrect link in the README

TL;DR

The link here does not work correctly:

Goes to https://legitify.dev/policies.html.

Expected behavior

Links should work 😉

Observed behavior

Error

Version

README

On which operating system are you using legitify?

Other (please elaborate in the description)

Relevant log output

GitHub UI

Additional information

No response

When running on an org in which I'm not an owner, there's a false-positive result

TL;DR

Running analyze --org some_org shows all results as skipped, except for one policy "Non-Admins Can Create Public Repositories" which shows as failed, even though I'm not an owner on some_org.

Expected behavior

In the results, show "Non-Admins Can Create Public Repositories" as skipped

Observed behavior

In the results, "Non-Admins Can Create Public Repositories" appears as failed

Version

0.1

On which operating system are you using legitify?

Mac OS

Relevant log output

No response

Additional information

No response

GitHub Actions token default permission

TL;DR

Add a policy that alerts if the GitHub Actions default permission is not read-only.
Applies for repository & organization

Detailed design

No response

Additional information

No response

Generate SLSA provenance documents for releases

TL;DR

Generate SLSA provenance documents for Legitify releases.

Detailed design

Preferably, implement it by using https://github.com/slsa-framework/slsa-github-generator.
Ideally, use the go-builder provided by this package to provide a highly-trusted builder.

Additional information

No response

Ability to pass arguments to the GitHub action

TL;DR

I dont see a way to pass arguments to the legitify executable when we use the GitHub Action. Can that be enabled? e.g. --scorecard

Detailed design

No response

Additional information

No response

improve missing permission handling

TL;DR

Skipping policies due to missing permissions is incomplete, and its output is messy.
We need to implement a unified solution to handle these and output them in a meaningful way.

Detailed design

  • Avoid having duplicate lines for the same permission errors
  • Cover all API calls.

Brew: Alter legitify.rb to support more CPU architectures and OS platforms

https://github.com/Legit-Labs/homebrew-legit-labs/blob/main/legitify.rb

See example on https://goreleaser.com/customization/homebrew/ (halfway on this page).

A more detailed example is given within section beneath "Detailed design".

Detailed design

# typed: false
# frozen_string_literal: true

# This file was generated by GoReleaser. DO NOT EDIT.
class Legitify < Formula
  desc "Legitify - open source scm scanning tool by Legit Security"
  homepage "https://github.com/Legit-Labs/legitify"
  version "v0.2.5"

  on_macos do
    if Hardware::CPU.intel?
      url "https://github.com/Legit-Labs/legitify/releases/download/v0.2.5/legitify_0.2.5_darwin_amd64.tar.gz"
      sha256 "`sha-code`"
    end 
    if Hardware::CPU.arm? && !Hardware::CPU.is_64_bit?
      url "https://github.com/Legit-Labs/legitify/releases/download/v0.2.5/legitify_0.2.5_darwin_arm64.tar.gz"
      sha256 "`sha-code`"
    end
  end

  on_linux do
    if Hardware::CPU.intel?
      url "https://github.com/Legit-Labs/legitify/releases/download/v0.2.5/legitify_0.2.5_linux_amd64.tar.gz"
      sha256 "f99114ec8500ad3d27410fa54c0e1d5b8d8eb9c7a57f76223254ee98916af22f"
    end
    if Hardware::CPU.arm? && !Hardware::CPU.is_64_bit?
      url "https://github.com/Legit-Labs/legitify/releases/download/v0.2.5/legitify_0.2.5_linux_arm64.tar.gz"
      sha256 "`sha-code`"
    end
  end

    def install
      bin.install "legitify"
    end
end

Additional information

I've tested it successfully on Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-67-generic x86_64) with the above file altered.

Fine-grained PAT not supported

TL;DR

The README refers to GitHub's new fine-grained personal access tokens but if you use one you get an error:

Error: GitHub token seems invalid (should have 40 characters)

Expected behavior

Accept fine grained access token

Observed behavior

No response

Version

0.1.5

On which operating system are you using legitify?

Linux

Relevant log output

No response

Additional information

No response

Convert: Crash converting JSON to SARIF due to panic

TL;DR

Currently, when using the new SARIF action, Legitify crashes due to a nil pointer dereference. This crash occurs when calling the action as Legit-Labs/legitify@36a5bc20c2fc38b31f1288af9fced03fb254a7d3.

Expected behavior

Ideally, the conversion would run.

Observed behavior

Legitify crashes 😢

Version

36a5bc2

On which operating system are you using legitify?

Linux

Relevant log output

legitify failed with:
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x103d61c]

goroutine 1 [running]:
github.com/Legit-Labs/legitify/internal/outputer/formatter.ValidateOutputFormat({0x7ffe3169bf37, 0x5}, {0x152d50a, 0x9})
/home/runner/work/legitify/legitify/internal/outputer/formatter/output_format.go:38 +0x5c
github.com/Legit-Labs/legitify/cmd.(*args).validateSchemeOutputOptions(0x211b460)
/home/runner/work/legitify/legitify/cmd/common_args.go:140 +0xc5
github.com/Legit-Labs/legitify/cmd.(*args).applySchemeOutputOptions(0x0?)
/home/runner/work/legitify/legitify/cmd/common_args.go:124 +0x1e
github.com/Legit-Labs/legitify/cmd.executeConvertCommand(0xc00032b180?, {0x1526f55?, 0x6?, 0x6?})
/home/runner/work/legitify/legitify/cmd/convert.go:55 +0x75
github.com/spf13/cobra.(*Command).execute(0xc00032b180, {0xc00007ad80, 0x6, 0x6})
/home/runner/go/pkg/mod/github.com/spf13/[email protected]/command.go:872 +0x694
github.com/spf13/cobra.(*Command).ExecuteC(0x2109160)
/home/runner/go/pkg/mod/github.com/spf13/[email protected]/command.go:990 +0x3bd
github.com/spf13/cobra.(*Command).Execute(...)
/home/runner/go/pkg/mod/github.com/spf13/[email protected]/command.go:918
github.com/Legit-Labs/legitify/cmd.Execute()
/home/runner/work/legitify/legitify/cmd/root.go:35 +0x198
main.main()
/home/runner/work/legitify/legitify/main.go:6 +0x17

Additional information

Here's an excerpt of the Actions workflow calling Legitify:

jobs:
  audit_log:
    runs-on: ubuntu-latest
    name: Organization Security Audit

    steps:
      - name: Legitify
        uses: Legit-Labs/legitify@36a5bc20c2fc38b31f1288af9fced03fb254a7d3
        with:
          github_token: ${{ secrets.AUDIT_GITHUB_TOKEN }}
          upload_code_scanning: true

Wrong detection by "organization_has_too_many_admins" check

TL;DR

We have 2 admin users in our GitHub organization but legitify alerts on that as if we have too many admins.

Expected behavior

I would expect that 3 admins and above will be considered too many.

Observed behavior

No response

Version

0.2.6

On which operating system are you using legitify?

Mac OS

Relevant log output

No response

Additional information

No response

"panic: send on closed channel" error when running 0.2.5

TL;DR

Running Legitify against our GitHub organisation with 800 repositories fails with an error message saying "panic: send on closed channel" and a stack trace (pasted below).

The bottom progress bar shows "secondary rate limit" and a counter going up to 60 seconds beforehand.

Expected behavior

I would expect to see some output from Legitify showing the analysis of our GitHub organisation

Observed behavior

The error output shown below

Version

0.2.5

On which operating system are you using legitify?

Mac OS

Relevant log output

panic: send on closed channel

goroutine 817 [running]:
github.com/Legit-Labs/legitify/internal/collectors.(*BaseCollector).CollectDataWithContext(...)
	/home/runner/work/legitify/legitify/internal/collectors/collector_utils.go:58
github.com/Legit-Labs/legitify/internal/collectors/github.(*repositoryCollector).collectRepository(0xc0005487d0, 0x2f6d6f632e627568?, {0xc000332360, 0xc}, 0xc000314200)
	/home/runner/work/legitify/legitify/internal/collectors/github/repository_collector.go:233 +0x413
github.com/Legit-Labs/legitify/internal/collectors/github.(*repositoryCollector).collectRepositories.func1.1()
	/home/runner/work/legitify/legitify/internal/collectors/github/repository_collector.go:210 +0x271
github.com/Legit-Labs/legitify/internal/common/group_waiter.(*GroupWaiter).Do.func1()
	/home/runner/work/legitify/legitify/internal/common/group_waiter/group_waiter.go:25 +0x5b
created by github.com/Legit-Labs/legitify/internal/common/group_waiter.(*GroupWaiter).Do
	/home/runner/work/legitify/legitify/internal/common/group_waiter/group_waiter.go:23 +0x8a

Additional information

No response

Improve policy language consistency

TL;DR

First off, fantastic tool. It's fast and I love to see something of this quality in the open source world.

However, I ran into an odd thing that could be a "bug", but is more likely a feature enhancement? Specifically, the policy title language used is not consistent and that leads to confusion when looking at the results in tabular form.

Examples:

  • "Workflows Are Allowed To Approve Pull Requests", status failed. Ok, makes sense. The workflows are allowed to do this, that's bad, so we failed it. But when we make a change and pass it... are we passing because the workflows are allowed to approve the requests?
  • But then you have: "Default branch is not protected", status passed. That doesn't make sense. The default branch is protected. Are you testing that it is or is not protected? I would think that a fail of "branch not protected" would mean the branch is in fact protected. The use of not is odd.
  • "Vulnerability Alerts Is Not Enabled", status passed. Aside from the is/are issue, is this checking that the alerts are not enabled, and I passed that they are not enabled? Or is it saying that they should be enabled and I passed because they are enabled?

I would suggest changing the policy titles to be affirmative or negative, and then make the test results clearly align to them throughout all your policy titles. This would greatly aid in clarity.

Example:

  • "Workflows should not be allowed to approve pull requests" pass/fail is clear in this case
  • "Default branch should be protected" pass/fail is clear in this case and it is consistent with the previous
  • "Vulnerability alerts should be enabled" pass/fail is clear and is consistent with previous

Also note, in my previous language there is a case to be made that "should" be changed to "must" if you want to conform with policy and standards language like RFC 2119 / 8174 / etc

Again, I love the idea of this tool and am really impressed with what you have done already. It's very useful. Just noticed this oddity and it made me a few other folks on my team go "huh?" so I thought I would share. Thanks again for a great tool, and I look forward to seeing where it goes. :)

image

Detailed design

No response

Additional information

Yes, this is pedantic. I do think it's important, though. I'm happy to help with suggested edits, but didn't want to do so unless there was appetite for it.

test

TL;DR

test

Expected behavior

test

Observed behavior

test

Version

1

On which operating system are you using legitify?

Mac OS

Relevant log output

No response

Additional information

No response

list-org fails when token is not SSO authorized for an organization

TL;DR

If the provided token isn't authorized for an organization the entire command fails

Expected behavior

should indicate that the specific organization is not processable and not fail the command

Observed behavior

No response

Version

v0.2.1

On which operating system are you using legitify?

Linux

Relevant log output

Using Github Cloud
Error: Token is not SAML authorized for organization: ORGANIZATION_NAME.
Please go to https://github.com/settings/tokens and authorize.

Additional information

No response

Homebrew installation

TL;DR

Would you consider adding support for installation by Homebrew?
goreleaser has built in support for creating taps

Detailed design

No response

Additional information

No response

version is not published correctly

TL;DR

'./legitify version' is returning 'na' instead of actual version

Expected behavior

expected 'version' command to return the actual cli version

Observed behavior

returned 'na'

Version

v0.1.3

On which operating system are you using legitify?

Mac OS

Relevant log output

No response

Additional information

No response

Add nightly that checks both the CLI and the container release

TL;DR

Add nightly that checks both the CLI and the container release, see that real data returns successfully.

Detailed design

A nightly scheduled github workflow that runs the CLI and the Container image with a real PAT (github secret), and assert the data returns as expected.

Additional information

No response

Add Export as CSV

TL;DR

Add an option to export Legitify findings as CSV files.
one CSV file for the findings summary, and one for each namespace.

Screenshot 2023-05-08 at 13 34 29

Screenshot 2023-05-08 at 13 35 07

Detailed design

No response

Additional information

No response

Old PAT patterns are not supported

TL;DR

As @carltonmason commented in #10, PATs generated for GHES instances might have a different pattern.
Remove the user-friendly checks (length & the ghp_ prefix) for GHES.

edit:
The issue is not with GHES but with old-style PATs (see comments for more info).
Instead of removing the check, we will just support the older pattern too.

Expected behavior

accept the custom PAT

Observed behavior

No response

Version

v0.1.5

On which operating system are you using legitify?

Linux

Relevant log output

No response

Additional information

No response

Support GitHub Org level branch policies

TL;DR

GitHub is now supporting org level branch policies. This means that we no longer need to define it at repo levels.

Detailed design

With org level branch policies, the actual branch policies will be a combination of the stricter policy at org and repo. Legitify should take both into consideration for the compliance run.

Additional information

No response

Rate Limit

TL;DR

When Legitify was run, after scanning some of the repositories, it waited for the rate limit for 60 seconds. But it returned the result without continuing to scan the remaining repositories

Expected behavior

I was expecting all repository to be scanned.

Observed behavior

No response

Version

0.2.5

On which operating system are you using legitify?

Mac OS

Relevant log output

No response

Additional information

No response

Install CLI in MAC

TL;DR

No response

Expected behavior

Install Tool in MAC

Observed behavior

No response

Version

latest

On which operating system are you using legitify?

Mac OS

Relevant log output

Error: legitify: Failed to download resource "legitify"
Failure while executing; `/usr/bin/env /usr/local/Homebrew/Library/Homebrew/shims/shared/curl --disable --cookie /dev/null --globoff --show-error --user-agent Homebrew/4.0.28\ \(Macintosh\;\ Intel\ Mac\ OS\ X\ 13.4.1\)\ curl/7.88.1 --header Accept-Language:\ en --retry 3 --fail --location --silent --head --request GET https://legitify.legitsecurity.com/0.2.6/darwin/amd64` exited with 22. Here's the output:
curl: (22) The requested URL returned error: 404
HTTP/2 302
date: Wed, 12 Jul 2023 20:46:52 GMT
location: https://github.com/Legit-Labs/legitify/releases/download/v0.2.6/legitify_0.2.6_darwin_amd64
strict-transport-security: max-age=15724800; includeSubDomains

HTTP/2 404
server: GitHub.com
date: Wed, 12 Jul 2023 20:46:07 GMT
content-type: text/plain; charset=utf-8
vary: X-PJAX, X-PJAX-Container, Turbo-Visit, Turbo-Frame, Accept-Encoding, Accept, X-Requested-With
cache-control: no-cache
strict-transport-security: max-age=31536000; includeSubdomains; preload
x-frame-options: deny
x-content-type-options: nosniff
x-xss-protection: 0
referrer-policy: no-referrer-when-downgrade
content-security-policy: default-src 'none'; base-uri 'self'; connect-src 'self'; form-action 'self'; img-src 'self' data:; script-src 'self'; style-src 'unsafe-inline'
content-length: 9
x-github-request-id: EBF7:500C:62D7E8:6A0A1E:64AF113C

Additional information

No response

Add Numbered Id's For Policies

RE: ID Numbers When referencing, it is much easier to reference a number, like GH-1, than a name. It also allows the policy name to change without breaking other references (see CIS benchmark example in previous comment). Like database primary/foreign keys; you want to reference the key so names and other things can change easily. When looking at most standards out there, like NIST, CIS, CSA, etc, they all reference each-other by specific numbers and not titles. See this link for one example of such a mapping. I would suggest doing the same here for both consistency and ease of reference.

Originally posted by @derekmurawsky in #139 (comment)

Randomly getting “Error: token doesn’t have access to any organization"

TL;DR

Randomly getting “Error: token doesn’t have access to any organization" - re-attempt of using the same token a few seconds later works just fine.

Expected behavior

Either get results, or the actual error that happened.

Observed behavior

The error returned is masked as “Error: token doesn’t have access to any organization" but the actual error returned from github is likely different.

Version

v0.1.5

On which operating system are you using legitify?

Mac OS

Relevant log output

No response

Additional information

Suspecting that this “Error: token doesn’t have access to any organization" error returns when a rate limit error is returned from github.

Premium GitLab accounts with skipped tests

TL;DR

Using the same Gitlab token, in different versions of legitify, skip rule revisions

version 0.2.6: does not perform the skip
version 0.2.8: perform the skip

Expected behavior

image

Observed behavior

image

Version

0.2.8

On which operating system are you using legitify?

Mac OS

Relevant log output

No response

Additional information

The command that was executed is ./legitify analyze --scm gitlab --namespace repository --org <name org>

Fine-grained PAT Support

TL;DR

GitHub recently announced that fine-grained PATs can now be used to call the GitHub GraphQL API.

As a result, it should be possible to use these with Legitify.

Detailed design

It may be a simple as removing the check in validateToken to enable support for fine-grained PATs. I'll test this and get a better idea if that's the case.

Additional information

No response

Auto remediation support

TL;DR

As the remediation steps suggest, many policies can be fixed automatically.
Introduce a new command to apply these fixes.

Detailed design

- Support for receiving the output of the analyze command as input.
- Add a standalone remediate command.
- Support for an auto-remediation flag for the analyze command.

Additional information

No response

Add third-party application policies

TL;DR

Third-party applications may expose risk when not restricted.
For instance:
image
This will allow you to prevent untrusted apps from accessing the organization's resources while allowing organization members to use apps for their personal accounts.

Detailed design

No response

Additional information

https://docs.github.com/en/enterprise-cloud@latest/organizations/restricting-access-to-your-organizations-data/enabling-oauth-app-access-restrictions-for-your-organization

Support GitLab Free

TL;DR

First of all thanks for building this tool.

I think that many organizations are using GitLab Free which comes without push_rules API endpoint or MR approval rules.

So, Are there plans to support GitLab Free? Or in other words, to ignore or disable non existing features like push rules?

Actually it fails with 404 errors during repository / gitlab project analysis and stops:

2023/06/15 14:22:13 2023/06/15 14:22:13 failed to query group hooks: 194 - legitify
2023/06/15 14:22:14 2023/06/15 14:22:14 failed to get project push rule GET [MASKED]api/v4/projects/145/push_rule: 404 {error: 404 Not Found}
2023/06/15 14:22:14 2023/06/15 14:22:14 project 'legitify-demo' collection failed with error: GET [MASKED]api/v4/projects/145/push_rule: 404 {error: 404 Not Found}
2023/06/15 14:22:14 2023/06/15 14:22:14 failed to get project push rule GET [MASKED]api/v4/projects/146/push_rule: 404 {error: 404 Not Found}
2023/06/15 14:22:14 2023/06/15 14:22:14 project 'unprotected-main-branch' collection failed with error: GET [MASKED]api/v4/projects/146/push_rule: 404 {error: 404 Not Found}

Detailed design

No response

Additional information

No response

Ignore invalid or expired certificate

TL;DR

When using Github or Gitlab server, many organizations have internal certificate issues that may prevent Legitify from protecting them.

Detailed design

add flag to ingore invalid certificate

Additional information

No response

analyze interface is inconsistent when it comes to GitLab

TL;DR

The documentation and flag names only document github

Expected behavior

use general terms

Observed behavior

only GitHub is mentioned

Version

v0.0.23

On which operating system are you using legitify?

Linux

Relevant log output

No response

Additional information

 ___      _______  _______  ___   _______  ___   _______  __   __
|   |    |       ||       ||   | |       ||   | |       ||  | |  |
|   |    |    ___||    ___||   | |_     _||   | |    ___||  |_|  |
|   |    |   |___ |   | __ |   |   |   |  |   | |   |___ |       |
|   |___ |    ___||   ||  ||   |   |   |  |   | |    ___||_     _|
|       ||   |___ |   |_| ||   |   |   |  |   | |   |      |   |
|_______||_______||_______||___|   |___|  |___| |___|      |___|
By Legit Security

Analyze GitHub organizations associated with a PAT to find security issues

Usage:
  legitify analyze [flags]

Flags:
      --color string            when to use coloring [auto/always/none] (default "auto")
  -e, --error-file string       error log path (default "error.log")
      --failed-only             Only show violated policies (do not show succeeded/skipped)
  -t, --github-token string     token to authenticate with github (required unless environment variable LEGITIFY_AUTH_TOKEN is set)
  -h, --help                    help for analyze
  -n, --namespace strings       which namespace to run (default [organization,repository,member,actions,runner_group])
      --org strings             specific organizations to collect
  -o, --output-file string      output file, defaults to stdout
  -f, --output-format string    output format [human/json/markdown] (default "human")
      --output-scheme string    output scheme [flattened/group-by-namespace/group-by-resource/group-by-severity] (default "flattened")
  -p, --policies-path strings   directory containing opa policies
      --repo strings            specific repositories to collect (--repo owner/repo_name (e.g. ossf/scorecard)
      --scm string              server type (GitHub, GitLab), defaults to GitHub (default "github")
      --scorecard string        Whether to run additional scorecard checks [no/yes/verbose] (default "no")
      --server-url string       github/gitlab endpoint to use instead of the Cloud API (can be set via the environment variable SERVER_URL)```
      
issues:
`Analyze GitHub organizations associated with a PAT to find security issues` --> GitHub/GitLab organizations
`--github-token` --> `--token`
`token to authenticate with github (required unless environment variable LEGITIFY_AUTH_TOKEN is set)` --> `with github/gitlab`

Convert the rego policies to be violated by default

TL;DR

Currently, policies are not violated by default, and we mark them as violated only if certain conditions are met. This makes our policies more complex and prone to errors.
For example:

default missing_default_branch_protection_force_push = false

missing_default_branch_protection_force_push {
    missing_default_branch_protection
}

missing_default_branch_protection_force_push {
        ....
	count(rules_allow_force_push) > 0
}

The missing_default_branch_protection_force_push policy needs to be defined as a partial policy that first checks if branch protection exists and then the specific condition.

Detailed design

Instead of the above, define the policy like this:

default missing_default_branch_protection_force_push = true
missing_default_branch_protection_force_push = false {
        ....
	count(rules_allow_force_push) == 0
}

This way, the policy needs to check only for the good case and not for all of the bad options.

Additional information

  • Make the changes gradually -> Pull request per rego file
  • The tests shouldn't fail. If you find yourself changing the tests, make sure you didn't break anything

Rule `Only Admins Should Be Able To Create Public Repositories` change visibility permission

TL;DR

The rule non_admins_can_create_public_repositories only checks if members can outright create a public repository. By default they can howether achieve the same thing by creating a private repository and changing the visibility of to public, as that is not restricted by that permission. Even worse, they can change the visibility of any repository that they are an admin of.

Thus, only prohibiting all visibility changes via the option Repository visibility change actually stops creation of public repositories. The current rule gives a very wrong impression of security while not giving the whole picture.

Expected behavior

Legitify should check that the member privileges have two settings:

  • Repository Creation only allows private, internal, or none
  • Repository visibility change is not allows

Observed behavior

It only checks for one setting

  • Repository Creation only allows private, internal, or none

Version

v0.2.5

On which operating system are you using legitify?

Linux

Relevant log output

No response

Additional information

See the GitHub Documentation page on Restricting repository creation in your organization specifically pointing this out.

Warning: This setting only restricts the visibility options available when repositories are created and does not restrict the ability to change repository visibility at a later time. For more information about restricting changes to existing repositories' visibilities, see "Restricting repository visibility changes in your organization."

GitHub Actions - Support output format compatible with Job Summaries

TL;DR

With the release of version 0.2.0, you officially added support for GitHub Actions to Legitify.

I've been experimenting with the examples at https://github.com/Legit-Labs/legitify/tree/main/action_examples and I think it would be beneficial for our use case to also have support for GitHub Actions Job Summaries.

Thanks for creating such a promising product!

Detailed design

Add yet another `--output-format` to the `legitify analyze`

Possible names `job-summary` or `markdown`

Additional information

No response

Custom Policy

TL;DR

modify the repository.rego file, commenting or removing some line to disable some rule.

Error at run time

image

Expected behavior

see if we can deactivate some rules according to team policies

Observed behavior

No response

Version

0.2.7

On which operating system are you using legitify?

Linux

Relevant log output

Error: compiler: 11 errors occurred:
../gitlab/repository.rego:11: rego_type_error: multiple default rules data.repository.project_not_maintained found
../gitlab/repository.rego:150: rego_type_error: multiple default rules data.repository.no_conversation_resolution found
../gitlab/repository.rego:180: rego_type_error: multiple default rules data.repository.code_review_not_required found
../gitlab/repository.rego:102: rego_type_error: multiple default rules data.repository.repository_require_code_owner_reviews_policy found
../gitlab/repository.rego:195: rego_type_error: multiple default rules data.repository.code_review_by_two_members_not_required found
../gitlab/repository.rego:240: rego_type_error: multiple default rules data.repository.repository_allows_committer_approvals_policy found
../gitlab/repository.rego:254: rego_type_error: multiple default rules data.repository.repository_dismiss_stale_reviews found
../gitlab/repository.rego:50: rego_type_error: multiple default rules data.repository.forking_allowed_for_repository found
../gitlab/repository.rego:121: rego_type_error: multiple default rules data.repository.project_webhook_doesnt_require_ssl found
../gitlab/repository.rego:210: rego_type_error: multiple default rules data.repository.repository_allows_review_requester_to_approve_their_own_request found
rego_compile_error: error limit reached

Additional information

No response

Support SARIF output format

TL;DR

Add SARIF as an additional output format

Detailed design

No response

Additional information

No response

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.