Giter Site home page Giter Site logo

guardian / amigo Goto Github PK

View Code? Open in Web Editor NEW
50.0 49.0 22.0 3.08 MB

AMIgo: An AMI bakery

Home Page: https://amigo.gutools.co.uk/

Scala 70.50% HTML 15.17% Ruby 0.16% JavaScript 1.11% CSS 0.60% Shell 5.22% Jinja 0.85% TypeScript 6.39%
production

amigo's Introduction

AMIgo

AMIgo is an application for baking AMIs (Amazon Machine Images). For information on how to use Amigo baked AMIs with Riffraff check here. This project is built with GitHub Actions.

Terminology

  • A base image is the source AMI to use as the basis for an image. For example you might have an "Ubuntu Wily" base image.

  • A role is something installed or configured on the machine. For example if you want your machine to have a JVM, Node and nginx pre-installed, you would assign the corresponding roles to your image. Currently roles are implemented as Ansible roles.

  • A recipe is a description of how to bake your AMI. Making a recipe consists of choosing a base image and deciding which roles to assign. For example you might have a recipe that builds an image based on Ubuntu Wily and installs a JVM, Node and nginx.

  • A bake is a single execution of a recipe. The result of a bake is an AMI.

Implementation

AMIgo is implemented as a Play application. It uses Packer and Ansible to bake AMIs.

AMI baking process

Roughly, AMIgo does the following:

  1. Dynamically generate an Ansible playbook based on the recipe's roles
  2. Dynamically generate a Packer build configuration file to install and then run Ansible
  3. Execute Packer as an external process
  4. Parse the Packer output and extract useful information from it

All data (base images, recipes, bakes, bake logs) are stored in DynamoDB. The Dynamo tables are created automatically if they do not exist.

Debugging recipes

When running in an environment that is not PROD there is an option to Bake with debug enabled. This passes the -debug flag through to packer which saves a copy of the SSH key in AMIgos working directory. This makes it possible to SSH onto the instance that is being used to build the AMI.

How to run locally

Testing ansible scripts without running amigo/packer

Warning: Multipass seems to struggle if running at the same time as the VPN. We recommend not running the VPN when using Multipass locally.

Amigo roles are simply Ansible scripts and can be run independently of Amigo itself. This is often a lot easier than running Amigo itself.

To test roles locally, run:

$ multipass/run.sh

This will install Multipass, a Canonical tool to manage Ubuntu VMs, and execute Ansible roles within it.

If you want to run commands/debug directly in the VM then (post installing things via run.sh), run:

$ multipass shell amigo-test

If the Multipass VM is timing out, try deleting and then re-running the script:

$ multipass stop amigo-test
$ multipass delete amigo-test
$ multipass purge amigo-test

You should also disconnect from the VPN too if using it.

Running the full app

Load the deployTools credentials using Janus, then execute ./script/server. This will run the Amigo app locally and the associated packer process should have the sufficient AWS authorization.

Note that you must use Java 11 to run this app. There are a few options for switching between Java versions at the time of writing:

Previous run locally advice

Install dependencies with ./script/setup

(For a faster but messier way of testing your ansible scripts - see 'Testing ansible scripts without runing amigo/packer' below.)

AMIgo requires Packer to be installed

To run the Play app, you will need credentials in either the deployTools profile or the default profile.

If you want to actually perform a bake, you will need separate credentials for Packer. These must be available either as environment variables or in the default profile. (Packer doesn't play nicely with named profiles.) I'm not sure whether Packer understands federated credentials, session token, etc. I created an IAM user with limited permissions (see below) and use that user's credentials.

If you have created a custom VPC in your AWS account (i.e. your account contains any VPCs other than the default one), then you will also need to tell Packer which VPC and subnet to use when building images:

$ cat ~/.configuration-magic/amigo.conf
packer {
  vpcId = "vpc-1234abcd"
  subnetId = "subnet-5678efgh"
  instanceProfile = "[optional] instance profile name for the box packer will run on"
}

If you want to use the packages role to install packages from an S3 bucket then you'll also need to configure that:

ansible {
  packages {
    s3bucket = "your-bucket"
    s3prefix = "an/optional/prefix/"
  }
}

Optionally, you may want to set associate_public_ip_address to true if your subnet does not default to this, to ensure Packer can SSH into your instance.

Once you have your credentials and config sorted out, just do:

$ sbt run

How to run the tests

$ sbt test

Required AWS permissions for Packer

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AttachVolume",
                "ec2:CreateVolume",
                "ec2:DeleteVolume",
                "ec2:CreateKeypair",
                "ec2:DeleteKeypair",
                "ec2:DescribeSubnets",
                "ec2:CreateSecurityGroup",
                "ec2:DeleteSecurityGroup",
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:CreateImage",
                "ec2:CopyImage",
                "ec2:RunInstances",
                "ec2:TerminateInstances",
                "ec2:StopInstances",
                "ec2:DescribeVolumes",
                "ec2:DetachVolume",
                "ec2:DescribeInstances",
                "ec2:CreateSnapshot",
                "ec2:DeleteSnapshot",
                "ec2:DescribeSnapshots",
                "ec2:DescribeImages",
                "ec2:RegisterImage",
                "ec2:CreateTags",
                "ec2:ModifyImageAttribute",
                "iam:*",
                "elasticloadbalancing:*"
            ],
            "Resource": "*"
        }
    ]
}

amigo's People

Contributors

akash1810 avatar aware avatar cb372 avatar davidfurey avatar dependabot[bot] avatar fredex42 avatar github-actions[bot] avatar gr211 avatar gu-scala-steward-public-repos[bot] avatar itsibitzi avatar jacobwinch avatar jfsoul avatar jharewinton avatar jorgeazevedo avatar juliabrigitte avatar katebee avatar kenoir avatar louishather avatar mbarton avatar michaelwmcnamara avatar mullefa avatar nicl avatar novembertang avatar philmcmahon avatar pvighi avatar reettaphant avatar sihil avatar tbonnin avatar tomrf1 avatar tylr-mk 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

Watchers

 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

amigo's Issues

Add more tags to AMIs

AMIs should be tagged with information about what features they contain.

  • One tag per feature? Is there a limit to the number of tags you can add?
  • Include info about custom variables passed to the role?

Should talk to @sihil and @adamnfish to decide on a format for tags that both Riff Raff and AMIable understand.

Should also add the AMIgo recipe ID as a tag.

AMI testing using ServerSpec

AMIgo should automatically test all AMIs that it bakes.

Tests would be per-role, defined inside the Ansible role directory. There's an example here

Investigate possible memory leak

Twice now I've SSHed into a long-running instance to find kswapd going crazy. Maybe we are leaking some resource every time we run Packer? Or maybe t2.micro is simply too small.

CVE-2019-14540 (High) detected in jackson-databind-2.7.1.jar, jackson-databind-2.9.5.jar

CVE-2019-14540 - High Severity Vulnerability

Vulnerable Libraries - jackson-databind-2.7.1.jar, jackson-databind-2.9.5.jar

jackson-databind-2.7.1.jar

General data-binding functionality for Jackson: works on core streaming API

Library home page: http://github.com/FasterXML/jackson

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.7.1.jar,canner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.7.1.jar

Dependency Hierarchy:

  • โŒ jackson-databind-2.7.1.jar (Vulnerable Library)
jackson-databind-2.9.5.jar

General data-binding functionality for Jackson: works on core streaming API

Library home page: http://github.com/FasterXML/jackson

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.9.5.jar

Dependency Hierarchy:

  • logstash-logback-encoder-5.1.jar (Root Library)
    • โŒ jackson-databind-2.9.5.jar (Vulnerable Library)

Found in HEAD commit: 42037f878b435e42e9262b44a73ceda0cdcf2a34

Found in base branch: main

Vulnerability Details

A Polymorphic Typing issue was discovered in FasterXML jackson-databind before 2.9.10. It is related to com.zaxxer.hikari.HikariConfig.

Publish Date: 2019-09-15

URL: CVE-2019-14540

CVSS 3 Score Details (9.8)

Base Score Metrics:

  • Exploitability Metrics:
    • Attack Vector: Network
    • Attack Complexity: Low
    • Privileges Required: None
    • User Interaction: None
    • Scope: Unchanged
  • Impact Metrics:
    • Confidentiality Impact: High
    • Integrity Impact: High
    • Availability Impact: High

For more information on CVSS3 Scores, click here.

Suggested Fix

Type: Upgrade version

Origin: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-14540

Release Date: 2019-09-15

Fix Resolution: com.fasterxml.jackson.core:jackson-databind:2.8.11.5,2.9.10,2.10.0.pr3,2.11.0.rc1


Step up your Open Source Security Game with WhiteSource here

CVE-2018-12022 (High) detected in jackson-databind-2.9.5.jar, jackson-databind-2.7.1.jar

CVE-2018-12022 - High Severity Vulnerability

Vulnerable Libraries - jackson-databind-2.9.5.jar, jackson-databind-2.7.1.jar

jackson-databind-2.9.5.jar

General data-binding functionality for Jackson: works on core streaming API

Library home page: http://github.com/FasterXML/jackson

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.9.5.jar

Dependency Hierarchy:

  • logstash-logback-encoder-5.1.jar (Root Library)
    • โŒ jackson-databind-2.9.5.jar (Vulnerable Library)
jackson-databind-2.7.1.jar

General data-binding functionality for Jackson: works on core streaming API

Library home page: http://github.com/FasterXML/jackson

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.7.1.jar,canner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.7.1.jar

Dependency Hierarchy:

  • โŒ jackson-databind-2.7.1.jar (Vulnerable Library)

Found in HEAD commit: 42037f878b435e42e9262b44a73ceda0cdcf2a34

Found in base branch: main

Vulnerability Details

An issue was discovered in FasterXML jackson-databind prior to 2.7.9.4, 2.8.11.2, and 2.9.6. When Default Typing is enabled (either globally or for a specific property), the service has the Jodd-db jar (for database access for the Jodd framework) in the classpath, and an attacker can provide an LDAP service to access, it is possible to make the service execute a malicious payload.

Publish Date: 2019-03-21

URL: CVE-2018-12022

CVSS 3 Score Details (7.5)

Base Score Metrics:

  • Exploitability Metrics:
    • Attack Vector: Network
    • Attack Complexity: High
    • Privileges Required: None
    • User Interaction: Required
    • Scope: Unchanged
  • Impact Metrics:
    • Confidentiality Impact: High
    • Integrity Impact: High
    • Availability Impact: High

For more information on CVSS3 Scores, click here.

Suggested Fix

Type: Upgrade version

Origin: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-12022

Release Date: 2019-03-21

Fix Resolution: 2.7.9.4, 2.8.11.2, 2.9.6


Step up your Open Source Security Game with WhiteSource here

CVE-2019-16335 (High) detected in jackson-databind-2.7.1.jar, jackson-databind-2.9.5.jar

CVE-2019-16335 - High Severity Vulnerability

Vulnerable Libraries - jackson-databind-2.7.1.jar, jackson-databind-2.9.5.jar

jackson-databind-2.7.1.jar

General data-binding functionality for Jackson: works on core streaming API

Library home page: http://github.com/FasterXML/jackson

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.7.1.jar,canner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.7.1.jar

Dependency Hierarchy:

  • โŒ jackson-databind-2.7.1.jar (Vulnerable Library)
jackson-databind-2.9.5.jar

General data-binding functionality for Jackson: works on core streaming API

Library home page: http://github.com/FasterXML/jackson

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.9.5.jar

Dependency Hierarchy:

  • logstash-logback-encoder-5.1.jar (Root Library)
    • โŒ jackson-databind-2.9.5.jar (Vulnerable Library)

Found in HEAD commit: 42037f878b435e42e9262b44a73ceda0cdcf2a34

Found in base branch: main

Vulnerability Details

A Polymorphic Typing issue was discovered in FasterXML jackson-databind before 2.9.10. It is related to com.zaxxer.hikari.HikariDataSource. This is a different vulnerability than CVE-2019-14540.

Publish Date: 2019-09-15

URL: CVE-2019-16335

CVSS 3 Score Details (9.8)

Base Score Metrics:

  • Exploitability Metrics:
    • Attack Vector: Network
    • Attack Complexity: Low
    • Privileges Required: None
    • User Interaction: None
    • Scope: Unchanged
  • Impact Metrics:
    • Confidentiality Impact: High
    • Integrity Impact: High
    • Availability Impact: High

For more information on CVSS3 Scores, click here.

Suggested Fix

Type: Upgrade version

Origin: https://github.com/FasterXML/jackson-databind/blob/master/release-notes/VERSION-2.x

Release Date: 2019-09-15

Fix Resolution: 2.9.10


Step up your Open Source Security Game with WhiteSource here

WS-2018-0125 (Medium) detected in jackson-core-2.7.1.jar

WS-2018-0125 - Medium Severity Vulnerability

Vulnerable Library - jackson-core-2.7.1.jar

Core Jackson abstractions, basic JSON streaming API implementation

Library home page: https://github.com/FasterXML/jackson-core

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-core/bundles/jackson-core-2.7.1.jar

Dependency Hierarchy:

  • jackson-databind-2.7.1.jar (Root Library)
    • โŒ jackson-core-2.7.1.jar (Vulnerable Library)

Found in HEAD commit: 42037f878b435e42e9262b44a73ceda0cdcf2a34

Found in base branch: main

Vulnerability Details

OutOfMemoryError when writing BigDecimal In Jackson Core before version 2.7.7.
When enabled the WRITE_BIGDECIMAL_AS_PLAIN setting, Jackson will attempt to write out the whole number, no matter how large the exponent.

Publish Date: 2016-08-25

URL: WS-2018-0125

CVSS 3 Score Details (5.3)

Base Score Metrics:

  • Exploitability Metrics:
    • Attack Vector: Network
    • Attack Complexity: Low
    • Privileges Required: None
    • User Interaction: None
    • Scope: Unchanged
  • Impact Metrics:
    • Confidentiality Impact: None
    • Integrity Impact: None
    • Availability Impact: Low

For more information on CVSS3 Scores, click here.

Suggested Fix

Type: Upgrade version

Origin: https://github.com/FasterXML/jackson-core/releases/tag/jackson-core-2.7.7

Release Date: 2016-08-25

Fix Resolution: com.fasterxml.jackson.core:jackson-core:2.7.7


Step up your Open Source Security Game with WhiteSource here

CVE-2018-14721 (High) detected in jackson-databind-2.7.1.jar, jackson-databind-2.9.5.jar

CVE-2018-14721 - High Severity Vulnerability

Vulnerable Libraries - jackson-databind-2.7.1.jar, jackson-databind-2.9.5.jar

jackson-databind-2.7.1.jar

General data-binding functionality for Jackson: works on core streaming API

Library home page: http://github.com/FasterXML/jackson

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.7.1.jar,canner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.7.1.jar

Dependency Hierarchy:

  • โŒ jackson-databind-2.7.1.jar (Vulnerable Library)
jackson-databind-2.9.5.jar

General data-binding functionality for Jackson: works on core streaming API

Library home page: http://github.com/FasterXML/jackson

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.9.5.jar

Dependency Hierarchy:

  • logstash-logback-encoder-5.1.jar (Root Library)
    • โŒ jackson-databind-2.9.5.jar (Vulnerable Library)

Found in HEAD commit: 42037f878b435e42e9262b44a73ceda0cdcf2a34

Found in base branch: main

Vulnerability Details

FasterXML jackson-databind 2.x before 2.9.7 might allow remote attackers to conduct server-side request forgery (SSRF) attacks by leveraging failure to block the axis2-jaxws class from polymorphic deserialization.

Publish Date: 2019-01-02

URL: CVE-2018-14721

CVSS 3 Score Details (10.0)

Base Score Metrics:

  • Exploitability Metrics:
    • Attack Vector: Network
    • Attack Complexity: Low
    • Privileges Required: None
    • User Interaction: None
    • Scope: Changed
  • Impact Metrics:
    • Confidentiality Impact: High
    • Integrity Impact: High
    • Availability Impact: High

For more information on CVSS3 Scores, click here.

Suggested Fix

Type: Upgrade version

Origin: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-14721

Release Date: 2019-01-02

Fix Resolution: com.fasterxml.jackson.core:jackson-databind:2.9.7,2.8.11.3,2.7.9.5,2.6.7.3


Step up your Open Source Security Game with WhiteSource here

Enhanced networking role removed for later xenial AMIs

The enhanced-networking role doesn't work on the latest Xenial AMIs due to a bug in the driver. However the later Xenial AMIs also include a late enough version of the driver that we no longer need to roll it ourselves.

I suggest that enhanced-networking is taken out of ubuntu-init and included explicitly where needed.

Scheduled bakes

For each recipe, you should have the option of specifying "bake this every N days"

logstash-deb role: support different architectures

Recent versions of logstash have architecture-specific downloads (e.g. 7.10.1) compared with older versions (e.g. 7.8.1).

This means that for 7.10.1 you would have to submit e.g. 7.10.1-amd64 as the version number parameter value in the logstash-deb role. Possibly ok ๐Ÿคทโ€โ™‚๏ธ but this does require developers to construct a URI which resolves to the logstash artifact.

Issue can impact developer productivity: since installing logstash on the AMI is typically at the end of the bake, if they aren't aware of this version quirk, it will take ~ time of a bake before they are.

CVE-2018-12023 (High) detected in jackson-databind-2.9.5.jar, jackson-databind-2.7.1.jar

CVE-2018-12023 - High Severity Vulnerability

Vulnerable Libraries - jackson-databind-2.9.5.jar, jackson-databind-2.7.1.jar

jackson-databind-2.9.5.jar

General data-binding functionality for Jackson: works on core streaming API

Library home page: http://github.com/FasterXML/jackson

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.9.5.jar

Dependency Hierarchy:

  • logstash-logback-encoder-5.1.jar (Root Library)
    • โŒ jackson-databind-2.9.5.jar (Vulnerable Library)
jackson-databind-2.7.1.jar

General data-binding functionality for Jackson: works on core streaming API

Library home page: http://github.com/FasterXML/jackson

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.7.1.jar,canner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.7.1.jar

Dependency Hierarchy:

  • โŒ jackson-databind-2.7.1.jar (Vulnerable Library)

Found in HEAD commit: 42037f878b435e42e9262b44a73ceda0cdcf2a34

Found in base branch: main

Vulnerability Details

An issue was discovered in FasterXML jackson-databind prior to 2.7.9.4, 2.8.11.2, and 2.9.6. When Default Typing is enabled (either globally or for a specific property), the service has the Oracle JDBC jar in the classpath, and an attacker can provide an LDAP service to access, it is possible to make the service execute a malicious payload.

Publish Date: 2019-03-21

URL: CVE-2018-12023

CVSS 3 Score Details (7.5)

Base Score Metrics:

  • Exploitability Metrics:
    • Attack Vector: Network
    • Attack Complexity: High
    • Privileges Required: None
    • User Interaction: Required
    • Scope: Unchanged
  • Impact Metrics:
    • Confidentiality Impact: High
    • Integrity Impact: High
    • Availability Impact: High

For more information on CVSS3 Scores, click here.

Suggested Fix

Type: Upgrade version

Origin: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-12022

Release Date: 2019-03-21

Fix Resolution: 2.7.9.4, 2.8.11.2, 2.9.6


Step up your Open Source Security Game with WhiteSource here

Show dependent roles in the UI

Recipes only show explicit roles in the UI. It should show dependent roles as well as those that are present by virtue of being in the provided base image.

Allow roles to be more easily added

I.e. extract them from the Amigo code so a deploy is not required to update the availble roles.

Some suggestions:

  • Move ansible tasks into dynamo and editable in UI.
  • Move ansible tasks per role into S3 and allow updating by pushing to S3 and an agent running within Amigo to update roles.
  • Keep roles in a Github repo, but hook merges to master to some mechanism that updates Amigo with the new set of ansible tasks (possibly by pushing them into S3)

won't build an AMI?

trying my first Amigo build, it bombed out at:

[2016-11-04 12:23:02] ubuntu statsd base: Executing Ansible: cd /tmp/packer-provisioner-ansible-local && ANSIBLE_FORCE_COLOR=1 PYTHONUNBUFFERED=1 ansible-playbook /tmp/packer-provisioner-ansible-local/amigo-ansible-ubuntu statsd base3628180008087539732.yml --verbose -c local -i /tmp/packer-provisioner-ansible-local/packer-provisioner-ansible-local681988031
[2016-11-04 12:23:07] ubuntu statsd base: ERROR! the playbook: /tmp/packer-provisioner-ansible-local/amigo-ansible-ubuntu could not be found

????

WS-2019-0379 (Medium) detected in commons-codec-1.10.jar

WS-2019-0379 - Medium Severity Vulnerability

Vulnerable Library - commons-codec-1.10.jar

The Apache Commons Codec package contains simple encoder and decoders for various formats such as Base64 and Hexadecimal. In addition to these widely used encoders and decoders, the codec package also maintains a collection of phonetic encoding utilities.

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/commons-codec/commons-codec/jars/commons-codec-1.10.jar

Dependency Hierarchy:

  • play-bootstrap3_2.11-0.4.5-P24.jar (Root Library)
    • play-netty-server_2.11-2.5.1.jar
      • play-server_2.11-2.5.1.jar
        • play_2.11-2.5.1.jar
          • โŒ commons-codec-1.10.jar (Vulnerable Library)

Found in HEAD commit: 42037f878b435e42e9262b44a73ceda0cdcf2a34

Found in base branch: main

Vulnerability Details

Apache commons-codec before version โ€œcommons-codec-1.13-RC1โ€ is vulnerable to information disclosure due to Improper Input validation.

Publish Date: 2019-05-20

URL: WS-2019-0379

CVSS 3 Score Details (6.5)

Base Score Metrics:

  • Exploitability Metrics:
    • Attack Vector: Network
    • Attack Complexity: Low
    • Privileges Required: None
    • User Interaction: None
    • Scope: Unchanged
  • Impact Metrics:
    • Confidentiality Impact: Low
    • Integrity Impact: Low
    • Availability Impact: None

For more information on CVSS3 Scores, click here.

Suggested Fix

Type: Upgrade version

Origin: apache/commons-codec@48b6157

Release Date: 2019-05-20

Fix Resolution: commons-codec:commons-codec:1.13


Step up your Open Source Security Game with WhiteSource here

Implement the role details page

URL = /roles/:id

  • Render README.md if there is one available.
  • Display any variables that the role accepts, along with their default values.
  • List dependencies on other roles
  • If feeling adventurous, let people browse the whole file tree in their browser! Or, more sensible, just display a link to the directory in GitHub,

Role usage

Show "transitive" usages. If I look at a role's usages I generally don't want to see that it's just used in a abase image, but rather all the recipes that are using it.

CVE-2020-7692 (High) detected in google-oauth-client-1.20.0.jar

CVE-2020-7692 - High Severity Vulnerability

Vulnerable Library - google-oauth-client-1.20.0.jar

Google OAuth Client Library for Java. Functionality that works on all supported Java platforms, including Java 5 (or higher) desktop (SE) and web (EE), Android, and Google App Engine.

Library home page: https://github.com/google/google-oauth-java-client

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.google.oauth-client/google-oauth-client/jars/google-oauth-client-1.20.0.jar

Dependency Hierarchy:

  • play-googleauth_2.11-0.4.0.jar (Root Library)
    • core-1.47.1.jar
      • google-oauth-client-jetty-1.11.0-beta.jar
        • google-oauth-client-java6-1.11.0-beta.jar
          • โŒ google-oauth-client-1.20.0.jar (Vulnerable Library)

Found in HEAD commit: 42037f878b435e42e9262b44a73ceda0cdcf2a34

Found in base branch: main

Vulnerability Details

PKCE support is not implemented in accordance with the RFC for OAuth 2.0 for Native Apps. Without the use of PKCE, the authorization code returned by an authorization server is not enough to guarantee that the client that issued the initial authorization request is the one that will be authorized. An attacker is able to obtain the authorization code using a malicious app on the client-side and use it to gain authorization to the protected resource. This affects the package com.google.oauth-client:google-oauth-client before 1.31.0.

Publish Date: 2020-07-09

URL: CVE-2020-7692

CVSS 3 Score Details (9.1)

Base Score Metrics:

  • Exploitability Metrics:
    • Attack Vector: Network
    • Attack Complexity: Low
    • Privileges Required: None
    • User Interaction: None
    • Scope: Unchanged
  • Impact Metrics:
    • Confidentiality Impact: High
    • Integrity Impact: High
    • Availability Impact: None

For more information on CVSS3 Scores, click here.

Suggested Fix

Type: Upgrade version

Origin: https://github.com/FriendsOfSymfony/oauth2-php/releases/tag/1.3.0

Release Date: 2020-07-09

Fix Resolution: 1.3.0


Step up your Open Source Security Game with WhiteSource here

CVE-2020-11619 (High) detected in jackson-databind-2.9.5.jar, jackson-databind-2.7.1.jar

CVE-2020-11619 - High Severity Vulnerability

Vulnerable Libraries - jackson-databind-2.9.5.jar, jackson-databind-2.7.1.jar

jackson-databind-2.9.5.jar

General data-binding functionality for Jackson: works on core streaming API

Library home page: http://github.com/FasterXML/jackson

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.9.5.jar

Dependency Hierarchy:

  • logstash-logback-encoder-5.1.jar (Root Library)
    • โŒ jackson-databind-2.9.5.jar (Vulnerable Library)
jackson-databind-2.7.1.jar

General data-binding functionality for Jackson: works on core streaming API

Library home page: http://github.com/FasterXML/jackson

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.7.1.jar,canner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.7.1.jar

Dependency Hierarchy:

  • โŒ jackson-databind-2.7.1.jar (Vulnerable Library)

Found in HEAD commit: 42037f878b435e42e9262b44a73ceda0cdcf2a34

Found in base branch: main

Vulnerability Details

FasterXML jackson-databind 2.x before 2.9.10.4 mishandles the interaction between serialization gadgets and typing, related to org.springframework.aop.config.MethodLocatingFactoryBean (aka spring-aop).

Publish Date: 2020-04-07

URL: CVE-2020-11619

CVSS 3 Score Details (8.1)

Base Score Metrics:

  • Exploitability Metrics:
    • Attack Vector: Network
    • Attack Complexity: High
    • Privileges Required: None
    • User Interaction: None
    • Scope: Unchanged
  • Impact Metrics:
    • Confidentiality Impact: High
    • Integrity Impact: High
    • Availability Impact: High

For more information on CVSS3 Scores, click here.

Suggested Fix

Type: Upgrade version

Origin: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11619

Release Date: 2020-04-07

Fix Resolution: com.fasterxml.jackson.core:jackson-databind:2.9.10.4


Step up your Open Source Security Game with WhiteSource here

CVE-2019-12086 (High) detected in jackson-databind-2.9.5.jar, jackson-databind-2.7.1.jar

CVE-2019-12086 - High Severity Vulnerability

Vulnerable Libraries - jackson-databind-2.9.5.jar, jackson-databind-2.7.1.jar

jackson-databind-2.9.5.jar

General data-binding functionality for Jackson: works on core streaming API

Library home page: http://github.com/FasterXML/jackson

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.9.5.jar

Dependency Hierarchy:

  • logstash-logback-encoder-5.1.jar (Root Library)
    • โŒ jackson-databind-2.9.5.jar (Vulnerable Library)
jackson-databind-2.7.1.jar

General data-binding functionality for Jackson: works on core streaming API

Library home page: http://github.com/FasterXML/jackson

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.7.1.jar,canner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.7.1.jar

Dependency Hierarchy:

  • โŒ jackson-databind-2.7.1.jar (Vulnerable Library)

Found in HEAD commit: 42037f878b435e42e9262b44a73ceda0cdcf2a34

Found in base branch: main

Vulnerability Details

A Polymorphic Typing issue was discovered in FasterXML jackson-databind 2.x before 2.9.9. When Default Typing is enabled (either globally or for a specific property) for an externally exposed JSON endpoint, the service has the mysql-connector-java jar (8.0.14 or earlier) in the classpath, and an attacker can host a crafted MySQL server reachable by the victim, an attacker can send a crafted JSON message that allows them to read arbitrary local files on the server. This occurs because of missing com.mysql.cj.jdbc.admin.MiniAdmin validation.

Publish Date: 2019-05-17

URL: CVE-2019-12086

CVSS 3 Score Details (7.5)

Base Score Metrics:

  • Exploitability Metrics:
    • Attack Vector: Network
    • Attack Complexity: Low
    • Privileges Required: None
    • User Interaction: None
    • Scope: Unchanged
  • Impact Metrics:
    • Confidentiality Impact: High
    • Integrity Impact: None
    • Availability Impact: None

For more information on CVSS3 Scores, click here.

Suggested Fix

Type: Upgrade version

Origin: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-12086

Release Date: 2019-05-17

Fix Resolution: 2.9.9


Step up your Open Source Security Game with WhiteSource here

WS-2018-0124 (Medium) detected in jackson-core-2.7.1.jar

WS-2018-0124 - Medium Severity Vulnerability

Vulnerable Library - jackson-core-2.7.1.jar

Core Jackson abstractions, basic JSON streaming API implementation

Library home page: https://github.com/FasterXML/jackson-core

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-core/bundles/jackson-core-2.7.1.jar

Dependency Hierarchy:

  • jackson-databind-2.7.1.jar (Root Library)
    • โŒ jackson-core-2.7.1.jar (Vulnerable Library)

Found in HEAD commit: 42037f878b435e42e9262b44a73ceda0cdcf2a34

Found in base branch: main

Vulnerability Details

In Jackson Core before version 2.8.6 if the REST endpoint consumes POST requests with JSON or XML data and data are invalid, the first unrecognized token is printed to server.log. If the first token is word of length 10MB, the whole word is printed. This is potentially dangerous and can be used to attack the server by filling the disk with logs.

Publish Date: 2018-06-24

URL: WS-2018-0124

CVSS 3 Score Details (5.3)

Base Score Metrics:

  • Exploitability Metrics:
    • Attack Vector: Network
    • Attack Complexity: Low
    • Privileges Required: None
    • User Interaction: None
    • Scope: Unchanged
  • Impact Metrics:
    • Confidentiality Impact: None
    • Integrity Impact: None
    • Availability Impact: Low

For more information on CVSS3 Scores, click here.

Suggested Fix

Type: Upgrade version

Origin: https://cve.mitre.org/cgi-bin/cvename.cgi?name=WS-2018-0124

Release Date: 2018-01-24

Fix Resolution: 2.8.6


Step up your Open Source Security Game with WhiteSource here

CVE-2019-17531 (High) detected in jackson-databind-2.9.5.jar, jackson-databind-2.7.1.jar

CVE-2019-17531 - High Severity Vulnerability

Vulnerable Libraries - jackson-databind-2.9.5.jar, jackson-databind-2.7.1.jar

jackson-databind-2.9.5.jar

General data-binding functionality for Jackson: works on core streaming API

Library home page: http://github.com/FasterXML/jackson

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.9.5.jar

Dependency Hierarchy:

  • logstash-logback-encoder-5.1.jar (Root Library)
    • โŒ jackson-databind-2.9.5.jar (Vulnerable Library)
jackson-databind-2.7.1.jar

General data-binding functionality for Jackson: works on core streaming API

Library home page: http://github.com/FasterXML/jackson

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.7.1.jar,canner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.7.1.jar

Dependency Hierarchy:

  • โŒ jackson-databind-2.7.1.jar (Vulnerable Library)

Found in HEAD commit: 42037f878b435e42e9262b44a73ceda0cdcf2a34

Found in base branch: main

Vulnerability Details

A Polymorphic Typing issue was discovered in FasterXML jackson-databind 2.0.0 through 2.9.10. When Default Typing is enabled (either globally or for a specific property) for an externally exposed JSON endpoint and the service has the apache-log4j-extra (version 1.2.x) jar in the classpath, and an attacker can provide a JNDI service to access, it is possible to make the service execute a malicious payload.

Publish Date: 2019-10-12

URL: CVE-2019-17531

CVSS 3 Score Details (9.8)

Base Score Metrics:

  • Exploitability Metrics:
    • Attack Vector: Network
    • Attack Complexity: Low
    • Privileges Required: None
    • User Interaction: None
    • Scope: Unchanged
  • Impact Metrics:
    • Confidentiality Impact: High
    • Integrity Impact: High
    • Availability Impact: High

For more information on CVSS3 Scores, click here.

Suggested Fix

Type: Upgrade version

Origin: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-17531

Release Date: 2019-10-12

Fix Resolution: 2.10


Step up your Open Source Security Game with WhiteSource here

Java runtimes using SecurityManagers unpragmatically cache DNS hits *forever*

This is the default behaviour of Java runtimes (in both Java 8 & 11 apparently), defined in the java.security file - they cache DNS hits forever:

# The Java-level namelookup cache policy for successful lookups:
#
# any negative value: caching forever
# any positive value: the number of seconds to cache an address for
# zero: do not cache
#
# default value is forever (FOREVER). For security reasons, this
# caching is made forever when a security manager is set. When a security
# manager is not set, the default behavior in this implementation
# is to cache for 30 seconds.
#
# NOTE: setting this to anything other than the default value can have
#       serious security implications. Do not set it unless
#       you are sure you are not exposed to DNS spoofing attack.
#
#networkaddress.cache.ttl=-1

Although intended as a security measure against DNS-spoofing, it's not very realistic in the AWS-based-world in which we operate - services do change their IP addresses from time to time, and so AWS recommend that a networkaddress.cache.ttl=60 setting be applied.

On the Ophan team @amyhughes & I have seen this result in us losing monitoring data as the Elastic-hosted monitoring cluster changed it's IP without our Elasticsearch nodes noticing- they attempted to continue sending data to the old IP addresses.

Elastic themselves recommend setting networkaddress.cache.ttl appropriately.

See also https://stackoverflow.com/q/1256556/438886

The java.security configuration file

Locating and patching the java.security file is a little fiddly - this is where you find it on today's images:

/etc/java-8-openjdk/security/java.security

Could we bake the updated setting into the AMI role?

Finish implementing the UI

This is boring, but I can't put it off forever...

We still need the following pages:

  • /base-images/:id - display detailed info about a base image
  • /base-images/:id/edit - form to update a base image
  • /base-images/new - form to create a base image
  • /roles/:id - display info extracted from the role's files. Render README.md if there is one available. Display any variables that the role accepts, along with their default values.
  • /recipes/:id - display detailed info about the recipe at top of page. Underneath, show a list of recently completed or running bakes, linking to the corresponding bake pages. Put a big Bake! button somewhere on the page.
  • /recipes/:id/edit - form to update a recipe
  • /recipes/new - form to create a recipe
  • /bake/:id - show logs for a bake. Updates in real time using SSE.

Google Auth

Every endpoint should require Google auth.

Once we have auth, we can add createdBy and modifiedBy to base images, recipes and bakes.

Support empty description

If you create a new role and leave the description blank, you get an error page showing a Dynamo exception. This is because we try to save a Dynamo attribute with an empty string value.

Workaround: replace empty string with " " before saving to Dynamo?

Handle \r character in Packer logs

Ansible does some fancy-pants logging in which it overwrites the line using \r. Currently we print this in a rather unsightly way:

(Reading database ... (Reading database ... 5% (Reading database ... 10% (Reading database ... 15% (Reading database ... 20% (Reading database ... 25% (Reading database ... 30% (Reading database ... 35% (Reading database ... 40% (Reading database ... 45% (Reading database ... 50% (Reading database ... 55% (Reading database ... 60% (Reading database ... 65% (Reading database ... 70% (Reading database ... 75% (Reading database ... 80% (Reading database ... 85% (Reading database ... 90% (Reading database ... 95% (Reading database ... 100% (Reading database ... 58006 files and directories currently installed.)

We could avoid this if we implemented proper support for \r, i.e. delete everything from the start of the current line to this point.

Recipes without descriptions can't be updated

You get a Dynamo update expression if you try to update a recipe that does not have a description.

Caused by: com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException:
Invalid UpdateExpression: An expression attribute value used in expression is not defined; 
attribute value: :l_l_l_l_l_update (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: 99ISP9BG3VA2D46N2VPV099UUVVV4KQNSO5AEMVJF66Q9ASUAAJG)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1579)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1249)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1030)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:742)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:716)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649)
	at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513)
	at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.doInvoke(AmazonDynamoDBClient.java:1974)
	at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:1950)
	at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.updateItem(AmazonDynamoDBClient.java:1708)
	at com.gu.scanamo.ops.ScanamoInterpreters$$anon$1.apply(ScanamoInterpreters.scala:75)
	at com.gu.scanamo.ops.ScanamoInterpreters$$anon$1.apply(ScanamoInterpreters.scala:50)
	at cats.free.Free$$anonfun$foldMap$1.apply(Free.scala:126)
	at cats.free.Free$$anonfun$foldMap$1.apply(Free.scala:124)
	at cats.package$$anon$1.tailRecM(package.scala:36)
	at cats.free.Free.foldMap(Free.scala:124)
	at cats.free.Free$$anonfun$foldMap$1.apply(Free.scala:127)
	at cats.free.Free$$anonfun$foldMap$1.apply(Free.scala:124)
	at cats.package$$anon$1.tailRecM(package.scala:36)
	at cats.free.Free.foldMap(Free.scala:124)
	at com.gu.scanamo.Scanamo$.exec(Scanamo.scala:17)
	at data.Dynamo$RichScanamoOps$.exec$extension(Dynamo.scala:97)
	at data.Recipes$.update(Recipes.scala:55)
	at controllers.RecipeController$$anonfun$updateRecipe$1$$anonfun$apply$6$$anonfun$apply$8.apply(RecipeController.scala:59)
	at controllers.RecipeController$$anonfun$updateRecipe$1$$anonfun$apply$6$$anonfun$apply$8.apply(RecipeController.scala:54)

...

The update is defined as below:

val update = table.update('id -> recipe.id,
      set('description -> description) and
        set('baseImageId -> baseImage.id) and
        set('roles -> roles) and
        set('modifiedBy -> modifiedBy) and
        set('modifiedAt -> DateTime.now()) and
        (if (bakeSchedule.isDefined) set('bakeSchedule -> bakeSchedule) else remove('bakeSchedule))
    )

I think the fix would be to only include Description in the update expression if it has been set, like we do for bakeSchedule?

Probably introduced by #28

CVE-2018-14720 (High) detected in jackson-databind-2.7.1.jar, jackson-databind-2.9.5.jar

CVE-2018-14720 - High Severity Vulnerability

Vulnerable Libraries - jackson-databind-2.7.1.jar, jackson-databind-2.9.5.jar

jackson-databind-2.7.1.jar

General data-binding functionality for Jackson: works on core streaming API

Library home page: http://github.com/FasterXML/jackson

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.7.1.jar,canner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.7.1.jar

Dependency Hierarchy:

  • โŒ jackson-databind-2.7.1.jar (Vulnerable Library)
jackson-databind-2.9.5.jar

General data-binding functionality for Jackson: works on core streaming API

Library home page: http://github.com/FasterXML/jackson

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.9.5.jar

Dependency Hierarchy:

  • logstash-logback-encoder-5.1.jar (Root Library)
    • โŒ jackson-databind-2.9.5.jar (Vulnerable Library)

Found in HEAD commit: 42037f878b435e42e9262b44a73ceda0cdcf2a34

Found in base branch: main

Vulnerability Details

FasterXML jackson-databind 2.x before 2.9.7 might allow attackers to conduct external XML entity (XXE) attacks by leveraging failure to block unspecified JDK classes from polymorphic deserialization.

Publish Date: 2019-01-02

URL: CVE-2018-14720

CVSS 3 Score Details (9.8)

Base Score Metrics:

  • Exploitability Metrics:
    • Attack Vector: Network
    • Attack Complexity: Low
    • Privileges Required: None
    • User Interaction: None
    • Scope: Unchanged
  • Impact Metrics:
    • Confidentiality Impact: High
    • Integrity Impact: High
    • Availability Impact: High

For more information on CVSS3 Scores, click here.

Suggested Fix

Type: Upgrade version

Origin: https://nvd.nist.gov/vuln/detail/CVE-2018-14720

Release Date: 2019-01-02

Fix Resolution: 2.9.7


Step up your Open Source Security Game with WhiteSource here

Fix the CSS on the roles page

  1. When you scroll down, the tasks well becomes really wide, which it's not supposed to do
  2. You can't read the whole of a long tasks file on a small screen

screen shot 2016-09-21 at 13 24 10

CVE-2016-4970 (High) detected in netty-handler-4.0.34.Final.jar

CVE-2016-4970 - High Severity Vulnerability

Vulnerable Library - netty-handler-4.0.34.Final.jar

Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers and clients.

Library home page: http://netty.io/

Path to vulnerable library: /home/wss-scanner/.ivy2/cache/io.netty/netty-handler/jars/netty-handler-4.0.34.Final.jar

Dependency Hierarchy:

  • play-bootstrap3_2.11-0.4.5-P24.jar (Root Library)
    • play-netty-server_2.11-2.5.1.jar
      • netty-reactive-streams-http-1.0.5.jar
        • netty-codec-http-4.0.34.Final.jar
          • โŒ netty-handler-4.0.34.Final.jar (Vulnerable Library)

Found in HEAD commit: 42037f878b435e42e9262b44a73ceda0cdcf2a34

Found in base branch: main

Vulnerability Details

handler/ssl/OpenSslEngine.java in Netty 4.0.x before 4.0.37.Final and 4.1.x before 4.1.1.Final allows remote attackers to cause a denial of service (infinite loop).

Publish Date: 2017-04-13

URL: CVE-2016-4970

CVSS 3 Score Details (7.5)

Base Score Metrics:

  • Exploitability Metrics:
    • Attack Vector: Network
    • Attack Complexity: Low
    • Privileges Required: None
    • User Interaction: None
    • Scope: Unchanged
  • Impact Metrics:
    • Confidentiality Impact: None
    • Integrity Impact: None
    • Availability Impact: High

For more information on CVSS3 Scores, click here.

Suggested Fix

Type: Upgrade version

Origin: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-4970

Release Date: 2017-04-13

Fix Resolution: io.netty:netty-all:4.0.37.Final,4.1.1.Final,io.netty:netty-handler:4.0.37.Final,4.1.1.Final


Step up your Open Source Security Game with WhiteSource here

Fix the tail -f scrolling behaviour

It's supposed to keep the scollbar at the bottom of the well, but it actually starts off about halfway down and gradually catches up with the tail as the log gets longer. Looks like I got my height calculations wrong somewhere.

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.