kdigger is a context discovery tool for Kubernetes penetration testing.

kdigger

kdigger, short for "Kubernetes digger", is a context discovery tool for Kubernetes penetration testing. This tool is a compilation of various plugins called buckets to facilitate pentesting Kubernetes from inside a pod.

Please note that this is not an ultimate pentest tool on Kubernetes. Some plugins perform really simple actions, that could be performed manually by calling the mount command or listing all devices present in dev with ls /dev for example. But some others automate scanning processes, such as the admission controller scanner. In the end, this tool aims to humbly speed up the pentesting process.

A small digger trying to move the evergreen stuck cruise ship in the suez canal

Table of content

Installation

Via releases

For installation instructions from binaries please visit the Releases Page.

Build from source

$ git clone https://github.com/quarkslab/kdigger
$ make

Then you can move the binary somewhere included in your PATH, for example:

$ sudo install kdigger /usr/local/bin

Via Go

$ go get github.com/quarkslab/kdigger

Usage

What you generally want to do is running all the buckets with dig all or just d a:

$ kdigger dig all

Help is provided by the CLI itself, just type kdigger to see the options:

$ kdigger
kdigger is an extensible CLI tool to dig around when you are in a Kubernetes
cluster. For that you can use multiples buckets. Buckets are plugins that can
scan specific aspects of a cluster or bring expertise to automate the Kubernetes
pentest process.

Usage:
  kdigger [command]

Available Commands:
  dig         Use all buckets or specific ones
  help        Help about any command
  ls          List available buckets or describe specific ones
  version     Print the version information

Flags:
  -h, --help            help for kdigger
  -o, --output string   Output format. One of: human|json. (default "human")
  -w, --width int       Width for the human output (default 140)

Use "kdigger [command] --help" for more information about a command.

Make sure to check out the help on the dig command to see all the available flags:

$ kdigger dig
This command runs buckets, special keyword "all" or "a" runs all registered
buckets. You can find information about all buckets with the list command. To
run one or more specific buckets, just input their names or aliases as
arguments.

Usage:
  kdigger dig [buckets] [flags]

Aliases:
  dig, d

Flags:
  -a, --active              Enable all buckets that might have side effect on environment.
      --admission-force     Force creation of pods to scan admission even without cleaning rights. (this flag is specific to the admission bucket)
  -c, --color               Enable color in output. (default true if output is human)
  -h, --help                help for dig
      --kubeconfig string   (optional) absolute path to the kubeconfig file (default "/home/mahe/.kube/config")
  -n, --namespace string    Kubernetes namespace to use. (default to the namespace in the context)

Global Flags:
  -o, --output string   Output format. One of: human|json. (default "human")
  -w, --width int       Width for the human output (default 140)

Details

Usage warning

Be careful when running this tool, some checks have side effects, like scanning your available syscalls or trying to create pods to scan the admission control. By default these checks will not run without the --active or -a flag.

For example, syscalls scans may succeed to perform some syscalls with empty arguments, and it can alter your environment or configuration. For instance, if the hostname syscall is successful, it will replace the hostname with the empty string. So please, NEVER run with sufficient permissions (as root for example) directly on your machine.

Results warning

Some tests are based on details of implementation or side effects on the environment that might be subject to changes in the future. So be cautious with the results.

On top of that, some results might need some experience to be understood and analyzed. To take a specific example, if you are granted the CAP_SYS_ADMIN capability inside a Kubernetes container, there is a good chance that it is because you are running in a privileged container. But you should definitely confirm that by looking at the number of devices available or the other capabilities that you are granted. Indeed, it might be necessary to get CAP_SYS_ADMIN to be privileged but it’s not sufficient and if it is your goal, you can easily trick the results by crafting very specific pods that might look confusing regarding this tool results.

It might not be the most sophisticated tool to pentest a Kubernetes cluster, but you can see this as a Kubernetes pentest 101 compilation!

Why another tool?

I started researching Kubernetes security a few months ago and participated in the 2021 Europe KubeCon Cloud-Native Security Day CTF. I learned a lot by watching various security experts conferences and demonstrations and this CTF was a really beginner-friendly entry point to practice what I learned in theory. During a live solving session, I had the opportunity to see how Kubernetes security experts were trying to solve the challenge, how they were thinking, what they were looking for.

So I decided to create a tool that compiles most of the checks we usually do as pentesters when in a Kubernetes pod to acquire information very quickly. There already are various tools out there. For example, a lot of experts were using amicontained, a famous container introspection tool by Jessie Frazelle. This tool is truly awesome, but some features are outdated, like the PID namespace detection, and it is not specialized in Kubernetes, it is only a container tool that can already give a lot of hints about your Kubernetes situation.

That is why, in kdigger, I included most of amicontained features. You can:

  • Try to guess your container runtime.
  • See your capabilities.
  • Scan for namespace activation and configuration.
  • Scan for the allowed syscalls.

But you can also do more Kubernetes specific operations:

  • Retrieve service account token.
  • Scan token permissions.
  • List interesting environment variables.
  • List available devices.
  • Retrieve all available services in a cluster.
  • Scan the admission controller chain!

Anyway, this tool is obviously not an automatically hack your Kubernetes cluster application, it is mostly just a compilation of tedious tasks that can be performed automatically very quickly. You still need a lot of expertise to interpret the digest and understand what the various outputs mean. And also, during pentest and challenges, you do not always have Internet access to pull your favorite toolchain, so you can also see this compilation as a checklist that you can somehow perform manually with a basic installation and a shell.

How this tool is built?

In addition to all the available features, this tool was built with a plugin design so that it can be easily extended by anyone that wants to bring some expertises.

For example, you are a security researcher on Kubernetes, and when you are doing CTFs or pentesting real infrastructure, you are often performing specific repetitive actions that could be automated or at least compiled with others. You can take a look at /pkg/plugins/template/template.go to bootstrap your own plugins and propose them to the project to extend the features! You only need a name, optionally some aliases, a description and filling the Run() function with the actual logic.

Areas for improvement

The expertize proposed by the tool could be refined and more precise. For now it's mostly dumping raw data for most of the buckets and rely on the user to understand what it implies.

Generally the output format is not the best and could be reworked. The human format via array lines does not fit all the use cases. The tool also proposes a JSON output format, it has the advantage to exist but is really quirky and uses arrays so extracting information might be a bit unpredictable.

How can I experience with this tool?

Good news! We created a mini Kubernetes CTF with basic steps to experience with the tool and resolve quick challenges. For more information go to the minik8s-ctf repository.

Buckets

You can list and describe the available buckets (or plugins) with kdigger list or kdigger ls:

$ kdigger ls
+---------------+----------------------------+---------------------------------+--------+
|      NAME     |           ALIASES          |           DESCRIPTION           | ACTIVE |
+---------------+----------------------------+---------------------------------+--------+
| admission     | [admissions adm]           | Admission scans the admission   | true   |
|               |                            | controller chain by creating    |        |
|               |                            | specific pods to find what is   |        |
|               |                            | prevented or not.               |        |
| authorization | [authorizations auth]      | Authorization checks your API   | false  |
|               |                            | permissions with the current    |        |
|               |                            | context or the available token. |        |
| capabilities  | [capability cap]           | Capabilities list all           | false  |
|               |                            | capabilities in all sets and    |        |
|               |                            | displays dangerous capabilities |        |
|               |                            | in red.                         |        |
| devices       | [device dev]               | Devices shows the list of       | false  |
|               |                            | devices available in the        |        |
|               |                            | container.                      |        |
| environment   | [environments environ env] | Environment checks the presence | false  |
|               |                            | of kubernetes related           |        |
|               |                            | environment variables and shows |        |
|               |                            | them.                           |        |
| mount         | [mounts mn]                | Mount shows all mounted devices | false  |
|               |                            | in the container.               |        |
| pidnamespace  | [pidnamespaces pidns]      | PIDnamespace analyses the PID   | false  |
|               |                            | namespace of the container in   |        |
|               |                            | the context of Kubernetes.      |        |
| processes     | [process ps]               | Processes analyses the running  | false  |
|               |                            | processes in your PID namespace |        |
| runtime       | [runtimes rt]              | Runtime finds clues to identify | false  |
|               |                            | which container runtime is      |        |
|               |                            | running the container.          |        |
| services      | [service svc]              | Services uses CoreDNS wildcards | false  |
|               |                            | feature to discover every       |        |
|               |                            | service available in the        |        |
|               |                            | cluster.                        |        |
| syscalls      | [syscall sys]              | Syscalls scans most of the      | true   |
|               |                            | syscalls to detect which are    |        |
|               |                            | blocked and allowed.            |        |
| token         | [tokens tk]                | Token checks for the presence   | false  |
|               |                            | of a service account token in   |        |
|               |                            | the filesystem.                 |        |
| userid        | [userids id]               | UserID retrieves UID, GID and   | false  |
|               |                            | their corresponding names.      |        |
| usernamespace | [usernamespaces userns]    | UserNamespace analyses the user | false  |
|               |                            | namespace configuration.        |        |
| version       | [versions v]               | Version dumps the API server    | false  |
|               |                            | version informations.           |        |
+---------------+----------------------------+---------------------------------+--------+

Admission

Admission scans the admission controller chain by creating specific pods to find what is prevented or not. The idea behind this bucket is to check, after you learned that you have create pods ability, if no admission controller like a PodSecurityPolicy or another is blocking you to create node privilege escalation pods. Like mounting the host filesystem, or the host PID namespace, or just a privileged container for example.

This bucket currently automatically tries to create:

  • a privileged pod
  • a privilege escalation pod
  • a host network pod
  • a host path pod
  • a run as root pod
  • a host PID pod

So, if you are granted rights to create pods, you can check the presence of any admission controller that might restrict you.

Authorization

Authorization checks your API permissions with the current context or the available token. If you use kdigger inside a pod as planned, it will check and use the service account token that is normally mounted inside the pod. Then it will basically operate exactly the same operation as if you do kubectl auth can-i --list and display the result.

Capabilities

Capabilities list all capabilities in all sets and displays dangerous capabilities in red.

Basically, in a non-privileged container, the result might look like that:

### CAPABILITIES ###
Comment: The bounding set contains 14 caps, it seems that you are running a non-privileged container.
+-------------+----------------------------------------------------+
|     SET     |                    CAPABILITIES                    |
+-------------+----------------------------------------------------+
| effective   | [chown dac_override fowner fsetid kill setgid      |
|             | setuid setpcap net_bind_service net_raw sys_chroot |
|             | mknod audit_write setfcap]                         |
| permitted   | [chown dac_override fowner fsetid kill setgid      |
|             | setuid setpcap net_bind_service net_raw sys_chroot |
|             | mknod audit_write setfcap]                         |
| inheritable | [chown dac_override fowner fsetid kill setgid      |
|             | setuid setpcap net_bind_service net_raw sys_chroot |
|             | mknod audit_write setfcap]                         |
| bounding    | [chown dac_override fowner fsetid kill setgid      |
|             | setuid setpcap net_bind_service net_raw sys_chroot |
|             | mknod audit_write setfcap]                         |
| ambient     | []                                                 |
+-------------+----------------------------------------------------+

This bucket might be especially useful to spot critical capabilities that can help you to escalate your privileges. This can be a good hint on whether you are running inside a privileged container or not.

Devices

Devices show the list of devices available in the container. This one is straightforward, it's equivalent to just ls /dev. Nevertheless, the number of available devices can also be a good hint on running in a privileged container or not.

Environment

Environment checks the presence of Kubernetes related environment variables and shows them. Like always, it's not sufficient, but detecting Kubernetes related environment variables can give you a pretty good idea that you are running in a Kubernetes cluster. That might be useful if you want to quickly find out where you are. Of course, this one is easy to confuse, by just exporting some environment variable or removing some.

Mount

Mount show all mounted devices in the container. This is equivalent to use the mount command directly but the number of mounted devices and reading path can show you mounted volumes, configmap or even secrets inside the pod.

PIDNamespace

PIDNamespace analyses the PID namespace of the container in the context of Kubernetes. Detecting the PID namespace is almost impossible so the idea of this bucket is to scan the /proc folder to search for specific processes like:

  • pause: it might signify that you are sharing the PID namespace between all the containers composing the pod.
  • kubelet: it might signify that you are sharing the PID namespace with the host.

By the way, the detection in amicontained is based on the device number of the namespace file, a detail of implementation which is no longer reliable and most of the time wrong. This is why I tried a different approach.

Processes

Processes analyses the running processes in your PID namespace. It is similar to any ps command that list all processes like ps -e or ps -A. It gives you the information of the number of running processes and if the first one is systemd.

Runtime

Runtime finds clues to identify which container runtime is running the container. This one is calling exactly the same code that the one in amicontained. It is using a package of the genuinetools/bpfd project to spot artefacts about container runtime that could betray their presence.

Please note that this is a 3 year old part of that code and that it makes no distinction between Docker and containerd.

Services

Services uses CoreDNS wildcards feature to discover every service available in the cluster. In fact, it appears that CoreDNS, that is now widely used in Kubernetes cluster proposes a wildcards features. You can learn more about it here in the documentation.

This bucket is extremely useful to perform discovery really fast in a Kubernetes cluster. The DNS will kindly give you every service domain present in the cluster.

Syscalls

Syscalls scans most of the syscalls to detect which are blocked and allowed. This one is also using a lot of the amicontained code base except that it also banned the SYS_PTRACE scan that causes a racing condition that can hang the program forever.

This is one really nice way to see if you are in a privileged container with a lot of capabilities quickly: the list of blocked syscall might be almost empty.

Token

Token checks for the presence of a service account token in the filesystem. Then it dumps the stuff it finds in /run/secrets/kubernetes.io/serviceaccount which is composed of the service account token itself, the namespace and the CA certificate of the kube API server.

You might want to use the -o json flag here and use jq to get that token fast!

UserID

UserID retrieves UID, GID and their corresponding names. It also gives homeDir as a bonus! Unfortunately, we can list all group IDs without CGO enabled. This is almost (because id is better) equivalent to run the id command directly.

UserNamespace

UserNamespace analyses the user namespace configuration. The user namespace is transparent and can be easily detected. It is even possible to read the mapping between the current user namespace and the outer namespace. Unfortunately for now, user namespace cannot be used with Kubernetes.

Version

Version dumps the API server version informations. It access the /version path that is accessible even by unauthenticated users. So even without a service account token you can request this information. You can get more information on what you can access as an system:unauthenticated user with kubectl describe clusterrolebinding | grep unauthenticated -B 9 for example. You may encounter the system:public-info-viewer cluster role, you can describe it with kubectl describe clusterrole system:public-info-viewer and display:

Name:         system:public-info-viewer
Labels:       kubernetes.io/bootstrapping=rbac-defaults
Annotations:  rbac.authorization.kubernetes.io/autoupdate: true
PolicyRule:
  Resources  Non-Resource URLs  Resource Names  Verbs
  ---------  -----------------  --------------  -----
             [/healthz]         []              [get]
             [/livez]           []              [get]
             [/readyz]          []              [get]
             [/version/]        []              [get]
             [/version]         []              [get]

Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

License

Apache License 2.0

Comments
  • Clarify arch is the builder and pull go ver from runtime

    Clarify arch is the builder and pull go ver from runtime

    buildVersion is the Go tree's version string at build time.

    https://cs.opensource.google/go/go/+/refs/tags/go1.18.3:src/runtime/extern.go;l=251-266

    uname -m still needs to be injected by the build host

    make it clear the arch is the builder's arch, not the current system's arch

  • Fix Auth Provider detection on using GKE, AKS

    Fix Auth Provider detection on using GKE, AKS

    See: https://github.com/kubernetes/client-go/issues/242

    Without explicit import, we got:

    ### VERSION ###
    Error: failed loading context to initialize client: no Auth Provider found for name "azure"
    
  • aarch64-linux support

    aarch64-linux support

    aarch64-linux support tracker


    Current build issues:

    # github.com/quarkslab/kdigger/pkg/plugins/syscalls
    pkg/plugins/syscalls/syscalls.go:155:7: undefined: unix.SYS_SELECT
    pkg/plugins/syscalls/syscalls.go:156:7: undefined: unix.SYS_PAUSE
    pkg/plugins/syscalls/syscalls.go:163:7: undefined: unix.SYS_FORK
    pkg/plugins/syscalls/syscalls.go:164:7: undefined: unix.SYS_VFORK
    pkg/plugins/syscalls/syscalls.go:173:47: undefined: unix.SYS_SELECT
    pkg/plugins/syscalls/syscalls.go:173:72: undefined: unix.SYS_PAUSE
    pkg/plugins/syscalls/syscalls.go:183:40: undefined: unix.SYS_FORK
    pkg/plugins/syscalls/syscalls.go:183:63: undefined: unix.SYS_VFORK
    pkg/plugins/syscalls/syscalls.go:230:12: undefined: unix.SYS_OPEN
    pkg/plugins/syscalls/syscalls.go:234:12: undefined: unix.SYS_STAT
    pkg/plugins/syscalls/syscalls.go:234:12: too many errors
    github.com/quarkslab/kdigger/pkg/plugins/authorization
    
    Original post
    # github.com/quarkslab/kdigger/pkg/plugins/syscalls
    pkg/plugins/syscalls/syscalls.go:155:7: undefined: unix.SYS_SELECT
    pkg/plugins/syscalls/syscalls.go:156:7: undefined: unix.SYS_PAUSE
    pkg/plugins/syscalls/syscalls.go:163:7: undefined: unix.SYS_FORK
    pkg/plugins/syscalls/syscalls.go:164:7: undefined: unix.SYS_VFORK
    pkg/plugins/syscalls/syscalls.go:173:47: undefined: unix.SYS_SELECT
    pkg/plugins/syscalls/syscalls.go:173:72: undefined: unix.SYS_PAUSE
    pkg/plugins/syscalls/syscalls.go:183:40: undefined: unix.SYS_FORK
    pkg/plugins/syscalls/syscalls.go:183:63: undefined: unix.SYS_VFORK
    pkg/plugins/syscalls/syscalls.go:230:12: undefined: unix.SYS_OPEN
    pkg/plugins/syscalls/syscalls.go:234:12: undefined: unix.SYS_STAT
    pkg/plugins/syscalls/syscalls.go:234:12: too many errors
    github.com/quarkslab/kdigger/pkg/plugins/authorization
    

    on aarch64-linux and x86_64-darwin

    are there plans for supporting non-x86_64-linux platforms in the future or no?

  • Add a pod security manifest fuzzer

    Add a pod security manifest fuzzer

    POC for #10.

    The idea would be to generate a random valid manifest in order to fuzz the admission control. Not in a traditional fuzzing sense, like finding crashes and bugs in the implementation of the admission, but finding loopholes in the admission rules.

    It uses google/gofuzz and custom fuzzing functions to generate a random but somehow valid v1.SecurityContext that can be injected into a pod's manifest.

    This POC should be extended to support more fields, like stated in the original idea issue:

    This should include pods with privileged initContainer and ephemeralContainers, as well as windows node specific security context fields.

    In order to test this POC, checkout to the fuzz branch, compile with make and generate random SecurityContext with ./kdigger gen -f. You can generate multiples with something like that for example:

    for _ in {0..10}; do ./kdigger gen -f -o json | jq '.spec.containers[].securityContext'; done
    

    You can check against the API server if they are valid with:

    ./kdigger gen -f | kubectl apply --dry-run=server -f -
    

    And by the way, I need to do an update on the main branch to scan the admission control with --dry-run by default.

  • Feature Request: kdigger gen --fuzz

    Feature Request: kdigger gen --fuzz

    Hi, I enjoy kdigger, it is helpful during pentests. Would it be possible to extend the gen command for fuzzing Kubernetes admission controllers?

    Wouldn't it be great if it could generate Kubernetes YAML manifests with all cutting edge container spec and security context fields? This should include pods with privileged initContainer and ephemeralContainers, as well as windows node specific security context fields. This could be used to test admission controls more thoroughly.

    Implementation ideas:

    • The existing Kubernetes mutating webhook logic could be extracted from K8s codebase and used to implement this
    • The tool could fetches the latest kubernetes OpenAPI spec for apps and use this as basis to generate valid manifests with all possible values for dangerous spec fields mutated
    • In order to fine-tune the mutator, the dangerous configs from the api spec must be studied to identify problematic combinations.
    • A small yet versatile base image should be used in the generated manifests that has sudo pre-installed (for allowPrivilegeescalation checks)

    Let me know your opinion about such a feature :-)

  • [feat] Add flag for namespaces during kdigger gen

    [feat] Add flag for namespaces during kdigger gen

    While kdigger gen the namespace flag is missing. It will be good to have the namespace flag during kdigger gen. One can still use ./kdigger gen | kubectl -n <namespace> apply -f - but adding a flag will help in generation of manifest along with namespace and then editing the same manifest after that.

    /assign

  • Add darwin x86 and linux aarch64 builds

    Add darwin x86 and linux aarch64 builds

    Resolves #3. Most things were discussed in the issue, but tl;dr:

    • Building on macOS is not that useful except for using remote features, but why not?
    • Building on aarch64 might be useful for Kubernetes nodes!
A yaml data-driven testing format together with golang testing library

Specimen Yaml-based data-driven testing Specimen is a yaml data format for data-driven testing. This enforces separation between feature being tested

Nov 24, 2022
Fortio load testing library, command line tool, advanced echo server and web UI in go (golang). Allows to specify a set query-per-second load and record latency histograms and other useful stats.
Fortio load testing library, command line tool, advanced echo server and web UI in go (golang). Allows to specify a set query-per-second load and record latency histograms and other useful stats.

Fortio Fortio (Φορτίο) started as, and is, Istio's load testing tool and now graduated to be its own project. Fortio is also used by, among others, Me

Jan 2, 2023
A next-generation testing tool. Orion provides a powerful DSL to write and automate your acceptance tests

Orion is born to change the way we implement our acceptance tests. It takes advantage of HCL from Hashicorp t o provide a simple DSL to write the acceptance tests.

Aug 31, 2022
Stress testing and benchmarking tool for the NEAR EVM

evm-bully --- stress testing and benchmarking tool for the NEAR EVM

May 30, 2022
HTTP load testing tool and library. It's over 9000!
HTTP load testing tool and library. It's over 9000!

Vegeta Vegeta is a versatile HTTP load testing tool built out of a need to drill HTTP services with a constant request rate. It can be used both as a

Jan 7, 2023
Coverage testing tool for The Go Programming Language

gocov Coverage reporting tool for The Go Programming Language Installation go get github.com/axw/gocov/gocov Usage There are currently four gocov comm

Jan 3, 2023
Ddosify - High-performance load testing tool
 Ddosify - High-performance load testing tool

Ddosify - High-performance load testing tool Features ✔️ Protocol Agnostic - Currently supporting HTTP, HTTPS, HTTP/2. Other protocols are on the way.

Jan 5, 2023
Merge Mock - testing tool for the Ethereum Merge

MergeMock Experimental debug tooling, mocking the execution engine and consensus node for testing. work in progress Quick Start To get started, build

Oct 21, 2022
Ditto is a CLI testing tool that helps you verify if multiple HTTP endpoints have the same outputs.

Ditto is a CLI testing tool that helps you verify if multiple HTTP endpoints have the same outputs.

Nov 24, 2021
Hive-fleet: a distributed, scalable load-testing tool built in go that leverages Google Cloud Functions

hive-fleet hive-fleet is a distributed, scalable load-testing tool, built on top

Jan 27, 2022
Client tool for testing HTTP server timeouts

HTTP timeout test client While testing Go HTTP server timeouts I wrote this little tool to help me test. It allows for slowing down header write and b

Sep 21, 2022
This testing tool surrounds go-ethereum with cannon to catch the blocks of retesteth going into go-ethereum and test cannon with them

Siege This testing tool surrounds go-ethereum with cannon to catch the blocks of retesteth going into go-ethereum and test cannon with them. Usage Sta

Mar 15, 2022
:exclamation:Basic Assertion Library used along side native go testing, with building blocks for custom assertions

Package assert Package assert is a Basic Assertion library used along side native go testing Installation Use go get. go get github.com/go-playground/

Jan 6, 2023
Expressive end-to-end HTTP API testing made easy in Go

baloo Expressive and versatile end-to-end HTTP API testing made easy in Go (golang), built on top of gentleman HTTP client toolkit. Take a look to the

Dec 13, 2022
Simple Go snapshot testing
Simple Go snapshot testing

Incredibly simple Go snapshot testing: cupaloy takes a snapshot of your test output and compares it to a snapshot committed alongside your tests. If t

Jan 5, 2023
Clean database for testing, inspired by database_cleaner for Ruby

DbCleaner Clean database for testing, inspired by database_cleaner for Ruby. It uses flock syscall under the hood to make sure the test can runs in pa

Nov 17, 2022
Golang HTTP client testing framework

flute Golang HTTP client testing framework Presentation https://speakerdeck.com/szksh/flute-golang-http-client-testing-framework Overview flute is the

Sep 27, 2022
API testing framework inspired by frisby-js
API testing framework inspired by frisby-js

frisby REST API testing framework inspired by frisby-js, written in Go Proposals I'm starting to work on frisby again with the following ideas: Read s

Sep 27, 2022
Mutation testing for Go source code

go-mutesting go-mutesting is a framework for performing mutation testing on Go source code. Its main purpose is to find source code, which is not cove

Dec 28, 2022