honeyquest
Honeyquest is a cyber security game that asks humans to distinguish neutral, risky, and deceptive payloads. Honeyquest presents participants with realistic web application vignettes ("queries"). Participants are asked to think like a hacker and tell us their next move.
Science Score: 57.0%
This score indicates how likely this project is to be science-related based on various indicators:
-
✓CITATION.cff file
Found CITATION.cff file -
✓codemeta.json file
Found codemeta.json file -
✓.zenodo.json file
Found .zenodo.json file -
✓DOI references
Found 4 DOI reference(s) in README -
○Academic publication links
-
○Academic email domains
-
○Institutional organization owner
-
○JOSS paper metadata
-
○Scientific vocabulary similarity
Low similarity (13.4%) to scientific vocabulary
Repository
Honeyquest is a cyber security game that asks humans to distinguish neutral, risky, and deceptive payloads. Honeyquest presents participants with realistic web application vignettes ("queries"). Participants are asked to think like a hacker and tell us their next move.
Basic Info
- Host: GitHub
- Owner: dynatrace-oss
- License: apache-2.0
- Language: Python
- Default Branch: main
- Homepage: https://honeyquest.cns.research.dynatracelabs.com/
- Size: 2.22 MB
Statistics
- Stars: 6
- Watchers: 2
- Forks: 0
- Open Issues: 9
- Releases: 1
Metadata Files
README.md
Honeyquest
Honeyquest is a cyber security game that asks humans to distinguish neutral, risky, and deceptive payloads. Honeyquest presents participants with realistic web application vignettes ("queries"). Participants are asked to think like a hacker and tell us their next move.
Honeyquest can be used to evaluate what vulnerabilities and cyber traps are most attractive to attackers.
- 🚀 Demo — honeyquest.cns.research.dynatracelabs.com <!-- - 📜 Paper — Honeyquest: Rapidly Measuring the Enticingness of Cyber Deception Techniques with Code-based Questionnaires -->

🐳 Quickstart
Use the Docker image to start Honeyquest.
Append the --help argument to see all available options.
sh
docker run -p 3000:3000 ghcr.io/dynatrace-oss/honeyquest -u https://raw.githubusercontent.com/dynatrace-oss/honeyquest/main/.github/hostedfiles/querydb.tar.gz
Then, navigate to 🌍 localhost:3000 in your browser.
📦 Project Structure
- 🚀 Want to TRY OUT Honeyquest? Visit our live demo at honeyquest.cns.research.dynatracelabs.com today.
- 📊 Want to ANALYZE the results from our human subject experiment? Navigate to the 📂
./datasetdirectory. - 🎨 Want to CREATE your own query database? Start with the 📄 QUERY_DATABASE document.
- 💻 Want to DEVELOP the Honeyquest application locally? Follow the Developer Guide below.
- ☁️ Want to DEPLOY Honeyquest to AWS? Refer to the 📄 DEPLOYMENT document.
- ⚖️ Want to CITE Honeyquest, our datasets, or our paper? Head to the License and Attribution section.
Honeyquest needs a query database to run. The query database contains the questions that are presented to the users.
Our queries are stored in the 📂 ./querydb directory. You can also create your own queries.
Queries are just YAML files with a specific structure that is described in the 📄 QUERY_DATABASE document.
To automate the creation of queries, we also provide a few Dagster jobs
which are described in the 📄 QUERY_CREATION document.
Some queries are created by "patching" existing queries with our separate 📂 ./src/honeypatch tool.
Find a bit of information about Honeypatch in the 📄 HONEYPATCH document.
The Honeyquest application consists of a frontend and a backend process. The frontend is a React application that serves the user interface. The backend is a Python application that exposes a REST API with FastAPI and does all the heavy lifting. Our Docker container bundles both the frontend and the backend into a single container for easy deployment.
During our study we ran a human subject experiment with 47 participants,
who submitted a total of 3,669 responses to our queries (and placed 6,659 individual marks).
We dataset is freely available for further research and analysis.
The dataset and a description of it is stored in the 📂 ./dataset directory.
Also, we provide a few Jupyter notebooks and Python scripts that we used to analyze the results in the
📂 ./src/honeyback/honeyquest/data/notebooks directory.
```mermaid graph TB; subgraph RESULTS ANALYSIS dataset["/dataset\nHUMAN SUBJECT\nSTUDY RESULTS"] notebooks["/src/honeyback\n/honeyquest/data/notebooks\nJupyter Notebooks"] end
subgraph "HONEYQUEST" direction TB frontend["/src/honeyfront\nReact Frontend"] backend["/src/honeyback\nPython Backend"] frontend -->|/api| backend; end
subgraph QUERY CREATION queries["/querydb\nQUERY DATABASE"] dagster["/src/honeyback\n/honeyquest/data/jobs\nCreate New Queries"] honeypatch["/src/honeypatch\nInject Traps"] end ```
💻 Developer Guide
Planning to make changes to the source code or just want to run Honeyquest locally? Read on.
Prerequisites
You need the following toolchain installed:
- Node.js 20 for the frontend app
- Python 3.10 for the backend API
- Poetry 2 for Python dependency management
- pre-commit for the pre-commit hooks
First, install Honeyfront (frontend for Honeyquest) dependencies.
sh
cd ./src/honeyfront
npm install
Then, install Honeyback (backend for Honeyquest) dependencies. Backend dependencies are split into multiple groups:
maincovers everything for Honeyquest and Dagster to runhooks(optional) contains pre-commit hooks, linters, formatters, and type checkersanalytics(optional) contains packages to analyze the data and create figuresdocker(optional) contains a process manager needed only inside the Docker container
sh
cd ./src/honeyback
poetry shell
poetry install --with hooks,analytics
Then, install Honeypatch dependencies. Note that this is a separate Poetry environment.
sh
cd ./src/honeypatch
poetry shell
poetry install
Then, back in the root directory, install the pre-commit hooks.
sh
pre-commit install
Start Honeyquest
The backend exposes a REST API to serve the queries. Don't forget to specify the folder that holds the query database. For more options, take a look at the CLI help or head to the Configuration section. Start the backend API with the following command:
sh
cd ./src/honeyback
poetry run honeyquest --data ../../querydb
The frontend serves the user interface.
During development, Vite will transparently proxy requests to /api to the backend REST API.
During production, an NGINX server in the Docker container will route these requests instead.
Start the frontend with the following command:
sh
cd ./src/honeyfront
npm run dev
Then, navigate to 🌍 localhost:3000 in your browser.
Answers from users are stored in a tempory directory that is printed to the console. Refer to the Configuration section to specify a different location.
Start Honeypatch
Honeypatch is stand-alone tool to inject traps into arbitrary, text-based payload. Start the program and read the help message.
sh
cd ./src/honeypatch
poetry run honeypatch --help
For more usage instructions, refer to the 📄 HONEYPATCH.md document.
⚙️ Configuration
Configure the query database
The backend API needs to be told where to find the query database. The query database contains the questions that are presented to the users.
The easiest way is to tell Honeyquest to download a .tar.gz compressed dataset from a public URL
and extract it on the fly with the --data-url argument (or the HONEYQUEST_DATA_URL environment variable).
The following command downloads our query database from GitHub and starts the backend:
sh
honeyquest --data-url https://raw.githubusercontent.com/dynatrace-oss/honeyquest/main/.github/hostedfiles/querydb.tar.gz
You can also pass the --data argument (or the HONEYQUEST_DATA environment variable)
to the CLI with the path to the query database. The following command uses our query database and starts the backend:
sh
honeyquest --data ./querydb
If you want to create your own query database, refer to the 📄 QUERY_DATABASE.md document.
List of available arguments and environment variables
| Environment Variable | CLI Argument | Description | Default |
| ----------------------------------------------- | -------------------- | ---------------------------------------------------- | ------------ |
| HONEYQUEST_DATA (required) 1 | -d or --data | Directory with the query database | not set |
| HONEYQUEST_DATA_URL (required) 1 | -u or --data-url | URL with the query database as a .tar.gz file | not set |
| HONEYQUEST_RESULTS | -r or --results | Directory for user profiles, responses, and feedback | temporary |
| HONEYQUEST_INDEX | -i or --index | Name of the query index 2 | main |
| ADMIN_TOKEN (recommended) | --admin-token | Token for the admin panel | random token |
| COOKIE_SECRET (recommended) | --cookie-secret | Secret to sign session cookies 3 | random token |
| COMPRESS_RESULTS | --compress | Compress results with gzip | false |
| SAMPLE_DUPLICATES | --duplicates | Sample duplicate queries 4 | false |
| COOKIE_EXPIRE_DAYS | | Maximum age of the browser cookie | 365 |
| SESSION_TIMEOUT_MINS | | Clusters user responses in multiple (session) files | 60 |
| API_BURST_LIMIT | | Capacity of the leaky bucket for rate limiting | 10 |
| API_RATE_LIMIT | | Refill rate of the leaky bucket for rate limiting | 1 |
| | --debug | Enable development mode | false |
| | --help | Shows the help text on the console | |
1 You must set only one of HONEYQUEST_DATA or HONEYQUEST_DATA_URL to start Honeyquest, not both.
2 The query database not only contains the questions but also one or more query indices.
Query indices define what questions are shown to the user, and in what order.
This argument allows to select a different index from the query database. If not set, the default index main is used.
If no main index is found, but there is only one index, that index is used. Otherwise, an error is thrown.
Refer to the 📄 QUERY_DATABASE.md document for more information.
3 You should set some secret to sign the session cookies to prevent session tampering. If you do not set this, a random token is generated on startup and printed to the console. If you ever change this, all existing sessions will be invalidated.
4 Allows users to submit the answers to the same query multiple times. This is useful during development with only a small example dataset to test the application.
⚖️ License and Attribution
- The source code is licensed under Apache 2.0
- The query database found in 📂
./querydbis licensed under ODbL 1.0 - The results from our human subject experiment found in 📂
./datasetare licensed under CC BY 4.0
Please note certain portions of source code, as identified in remarks, are provided under the Creative Commons BY-SA or the MIT license. In each of the remarks, we have provided attribution to the original creators and other attribution parties.
If you use Honeyquest, our query database, or our experimental results, please cite the following work:
Mario Kahlhofer, Stefan Achleitner, Stefan Rass, and René Mayrhofer. 2024. Honeyquest: Rapidly Measuring the Enticingness of Cyber Deception Techniques with Code-based Questionnaires. In The 27th International Symposium on Research in Attacks, Intrusions and Defenses (RAID 2024), September 30-October 02, 2024, Padua, Italy. ACM, New York, NY, USA, 20 pages. https://doi.org/10.1145/3678890.3678897
Note: Honeyquest is not officially supported by Dynatrace.
Owner
- Name: Dynatrace Open Source
- Login: dynatrace-oss
- Kind: organization
- Email: opensource@dynatrace.com
- Website: https://engineering.dynatrace.com
- Repositories: 40
- Profile: https://github.com/dynatrace-oss
This organization contains Open Source projects maintained by Dynatrace. If not stated differently, these projects are not officially supported.
Citation (CITATION.cff)
cff-version: 1.2.0
title: Honeyquest
license: Apache-2.0
type: software
identifiers:
- type: url
value: "https://github.com/dynatrace-oss/honeyquest"
authors:
- given-names: Mario
family-names: Kahlhofer
orcid: https://orcid.org/0000-0002-6820-4953
message: If you use Honeyquest, please cite our research paper.
preferred-citation:
type: conference-paper
title: "Honeyquest: Rapidly Measuring the Enticingness of Cyber Deception Techniques with Code-based Questionnaires"
doi: 10.1145/3678890.3678897
year: 2024
collection-title: Proceedings of the 27th International Symposium on Research in Attacks, Intrusions and Defenses
conference:
name: 27th International Symposium on Research in Attacks, Intrusions and Defenses
city: Padua
country: IT
date-start: 2024-09-30
date-end: 2024-10-02
publisher:
name: ACM
city: New York, NY, USA
authors:
- given-names: Mario
family-names: Kahlhofer
orcid: https://orcid.org/0000-0002-6820-4953
- given-names: Stefan
family-names: Achleitner
orcid: https://orcid.org/0000-0002-5499-6101
- given-names: Stefan
family-names: Rass
orcid: https://orcid.org/0000-0003-2821-2489
- given-names: René
family-names: Mayrhofer
orcid: https://orcid.org/0000-0003-1566-4646
GitHub Events
Total
- Watch event: 1
- Delete event: 1
- Push event: 7
- Pull request event: 1
Last Year
- Watch event: 1
- Delete event: 1
- Push event: 7
- Pull request event: 1
Issues and Pull Requests
Last synced: 11 months ago
All Time
- Total issues: 10
- Total pull requests: 0
- Average time to close issues: N/A
- Average time to close pull requests: N/A
- Total issue authors: 1
- Total pull request authors: 0
- Average comments per issue: 0.0
- Average comments per pull request: 0
- Merged pull requests: 0
- Bot issues: 0
- Bot pull requests: 0
Past Year
- Issues: 10
- Pull requests: 0
- Average time to close issues: N/A
- Average time to close pull requests: N/A
- Issue authors: 1
- Pull request authors: 0
- Average comments per issue: 0.0
- Average comments per pull request: 0
- Merged pull requests: 0
- Bot issues: 0
- Bot pull requests: 0
Top Authors
Issue Authors
- blu3r4y (9)
Pull Request Authors
Top Labels
Issue Labels
Pull Request Labels
Dependencies
- actions/cache v4 composite
- actions/checkout v4 composite
- docker/build-push-action v6 composite
- docker/login-action v3 composite
- docker/metadata-action v5 composite
- docker/setup-buildx-action v3 composite
- bitnami/git 2.45.2 build
- docker.io/nikolaik/python-nodejs python3.10-nodejs20@sha256 build
- docker.io/nikolaik/python-nodejs python3.10-nodejs20@sha256 build
- 486 dependencies
- @eslint/js ^8.57.0 development
- @types/bootstrap ^5.2.10 development
- @types/eslint__js ^8.42.3 development
- @types/js-cookie ^3.0.6 development
- @types/node ^20.14.11 development
- @types/react ^18.3.3 development
- @types/react-dom ^18.3.0 development
- @vitejs/plugin-react ^4.2.1 development
- eslint ^8.57.0 development
- eslint-config-prettier ^9.1.0 development
- eslint-plugin-react ^7.35.0 development
- prettier 3.3.3 development
- typescript ^5.5.4 development
- typescript-eslint ^7.17.0 development
- vite ^5.3.5 development
- @fontsource-variable/fira-code ^5.0.18
- @fontsource/fira-code ^5.0.18
- bootstrap ^5.3.3
- bootstrap-icons ^1.11.3
- dayjs ^1.11.12
- js-cookie ^3.0.5
- react ^18.3.1
- react-dom ^18.3.1
- react-markdown ^9.0.1
- react-query ^3.39.3
- react-select ^5.8.0
- tuplerone ^3.3.3
- usehooks-ts ^3.1.0
- 207 dependencies
- ipywidgets ^8.1.3 analytics
- matplotlib ^3.9.1 analytics
- numpy ^1.26.4 analytics
- pandas ^1.5.3 analytics
- pylatex ^1.4.2 analytics
- rpy2 ^3.5.16 analytics
- scipy ^1.14.0 analytics
- seaborn ^0.13.2 analytics
- circus * docker
- black * hooks
- boto3-stubs ^1.34 hooks
- flake8 * hooks
- flake8-docstrings * hooks
- flake8-rst-docstrings * hooks
- isort * hooks
- mypy * hooks
- pandas-stubs ^1.5 hooks
- pre-commit * hooks
- pylint * hooks
- types-PyYAML ^6.0 hooks
- types-Pygments ^2.18 hooks
- types-cffi ^1.16 hooks
- types-colorama ^0.4 hooks
- types-croniter ^2.0 hooks
- types-decorator ^5.1 hooks
- types-jsonschema ^4.23 hooks
- types-protobuf ^3.20 hooks
- types-psutil ^6.0 hooks
- types-python-dateutil ^2.9 hooks
- types-pytz ^2024 hooks
- types-pywin32 ^306 hooks
- types-requests ^2.32 hooks
- types-setuptools ^71.1 hooks
- types-six ^1.16 hooks
- types-toposort ^1.10 hooks
- types-tqdm ^4.66 hooks
- PyYAML ^6.0.1
- boto3 ^1.34.149
- dagit ^0.14.20
- dagster ^0.14.20
- fastapi ^0.111.1
- ipykernel ^6.29.5
- itsdangerous ^1.1.0
- loguru ^0.7.2
- lxml 5.1.1
- mistune ^3.0.2
- pendulum ^2.1.2
- pydantic ^2.8.2
- pydantic-settings ^2.3.4
- python ~3.10
- python-dotenv *
- requests *
- sqlalchemy ^1.4.44
- typer ^0.12.3
- annotated-types 0.7.0
- astroid 3.2.4
- black 24.4.2
- cfgv 3.4.0
- click 8.1.7
- colorama 0.4.6
- coverage 7.6.0
- dill 0.3.8
- distlib 0.3.8
- docutils 0.21.2
- exceptiongroup 1.2.2
- filelock 3.15.4
- flake8 7.1.0
- flake8-docstrings 1.7.0
- flake8-rst-docstrings 0.3.0
- identify 2.6.0
- iniconfig 2.0.0
- isort 5.13.2
- loguru 0.7.2
- markdown-it-py 3.0.0
- mccabe 0.7.0
- mdurl 0.1.2
- mypy 1.11.0
- mypy-extensions 1.0.0
- nodeenv 1.9.1
- packaging 24.1
- pathspec 0.12.1
- platformdirs 4.2.2
- pluggy 1.5.0
- pre-commit 3.8.0
- pycodestyle 2.12.0
- pydantic 2.8.2
- pydantic-core 2.20.1
- pydocstyle 6.3.0
- pyflakes 3.2.0
- pygments 2.18.0
- pylint 3.2.6
- pytest 8.3.2
- pytest-cov 5.0.0
- pyyaml 6.0.1
- restructuredtext-lint 1.4.0
- rich 13.7.1
- shellingham 1.5.4
- snowballstemmer 2.2.0
- tomli 2.0.1
- tomlkit 0.13.0
- typer 0.12.3
- types-pyyaml 6.0.12.20240724
- typing-extensions 4.12.2
- virtualenv 20.26.3
- win32-setctime 1.1.0
- black * develop
- flake8 * develop
- flake8-docstrings * develop
- flake8-rst-docstrings * develop
- isort * develop
- mypy * develop
- pre-commit * develop
- pylint * develop
- pytest * develop
- pytest-cov * develop
- types-PyYAML ^6.0 develop
- PyYAML ^6.0.1
- loguru ^0.7.2
- pydantic ^2.8.2
- python ~3.10
- typer ^0.12.3