Uploading the Disarm-AttackFlow Builder
Modified version of the AttackFlow Builder from MITRE. Includes DISARM framework components with full integration of QOL and STIX objects.
2
database/.dockerignore
Обычный файл
@ -0,0 +1,2 @@
|
||||
node_modules/
|
||||
__pycache__/
|
||||
168
database/.github/workflows/build.yml
поставляемый
Обычный файл
@ -0,0 +1,168 @@
|
||||
name: Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
tags:
|
||||
- 'v*'
|
||||
pull_request:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
id-token: write
|
||||
pages: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
attack_flow_builder:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '19'
|
||||
- name: Install dependencies
|
||||
working-directory: ./src/attack_flow_builder/
|
||||
run: npm ci
|
||||
- name: Build
|
||||
working-directory: ./src/attack_flow_builder/
|
||||
env:
|
||||
# Workaround for node.js bug: https://github.com/webpack/webpack/issues/14532
|
||||
NODE_OPTIONS: "--openssl-legacy-provider"
|
||||
run: npm run build
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: attack_flow_builder
|
||||
path: src/attack_flow_builder/dist/
|
||||
|
||||
comment_flow_links:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/github-script@v6
|
||||
if: github.event_name == 'pull_request'
|
||||
env:
|
||||
PR_NUMBER: ${{ github.event.number }}
|
||||
with:
|
||||
script: |
|
||||
const { PR_NUMBER, GITHUB_SHA } = process.env;
|
||||
const builderUrl = "https://center-for-threat-informed-defense.github.io/attack-flow/ui/?src=";
|
||||
const baseRawUrl = "https://raw.githubusercontent.com/center-for-threat-informed-defense/attack-flow"
|
||||
const response = await github.rest.pulls.listFiles({
|
||||
"owner": "center-for-threat-informed-defense",
|
||||
"repo": "attack-flow",
|
||||
"pull_number": PR_NUMBER,
|
||||
"per_page": 50,
|
||||
"page": 1,
|
||||
});
|
||||
const bullets = [];
|
||||
for (const file of response.data) {
|
||||
if (file.filename.startsWith("corpus/")) {
|
||||
const flowName = file.filename.split("/").pop();
|
||||
const flowArg = `${baseRawUrl}/${GITHUB_SHA}/corpus/${flowName}`;
|
||||
console.log(flowArg)
|
||||
const flowUrl = builderUrl + encodeURIComponent(flowArg);
|
||||
bullets.push(`* [${flowName}](${flowUrl})`);
|
||||
}
|
||||
}
|
||||
if (bullets.length > 0) {
|
||||
github.rest.issues.createComment({
|
||||
issue_number: context.issue.number,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body: "Open this PR's flows in Attack Flow Builder:\n\n" + bullets.join("\n") + "\n",
|
||||
})
|
||||
}
|
||||
|
||||
docs:
|
||||
needs: attack_flow_builder
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.8'
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '19'
|
||||
- name: Update APT
|
||||
run: sudo apt update
|
||||
- name: Install APT dependencies
|
||||
run: sudo apt install graphviz
|
||||
- name: Install Poetry
|
||||
run: curl -sSL https://install.python-poetry.org/ | python -
|
||||
- name: Add Poetry to PATH
|
||||
run: echo "$HOME/.poetry/bin" >> $GITHUB_PATH
|
||||
- name: Install Python dependencies
|
||||
run: poetry install
|
||||
- name: Install Node dependencies
|
||||
working-directory: ./src/attack_flow_builder/
|
||||
run: npm ci
|
||||
- name: Install Mermaid
|
||||
run: npm install -g @mermaid-js/mermaid-cli
|
||||
- name: Create client directory
|
||||
run: mkdir docs/extra/ui
|
||||
- name: Download Attack Flow Builder
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: attack_flow_builder
|
||||
path: docs/extra/ui
|
||||
- name: Make Attack Flow schema
|
||||
run: poetry run make docs-schema
|
||||
- name: Validate Corpus
|
||||
env:
|
||||
# Workaround for node.js bug: https://github.com/webpack/webpack/issues/14532
|
||||
NODE_OPTIONS: "--openssl-legacy-provider"
|
||||
run: poetry run make validate
|
||||
- name: Copy corpus into docs
|
||||
env:
|
||||
# Workaround for node.js bug: https://github.com/webpack/webpack/issues/14532
|
||||
NODE_OPTIONS: "--openssl-legacy-provider"
|
||||
run: poetry run make docs-examples
|
||||
- name: Copy matrix-viz code into docs
|
||||
run: poetry run make docs-matrix
|
||||
- name: Build HTML docs
|
||||
run: poetry run sphinx-build -M dirhtml docs docs/_build -W --keep-going
|
||||
- name: Upload HTML docs
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: attack_flow_docs_html
|
||||
path: docs/_build/dirhtml/
|
||||
- name: Install TeX Live
|
||||
run: sudo apt install -y latexmk texlive texlive-latex-extra
|
||||
- name: Build PDF docs
|
||||
run: poetry run sphinx-build -M latexpdf docs docs/_build
|
||||
- name: Upload PDF docs
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: attack_flow_docs_pdf
|
||||
path: docs/_build/latex/attackflow.pdf
|
||||
|
||||
github_pages:
|
||||
# This job only runs when committing or merging to main branch.
|
||||
if: startsWith(github.ref, 'refs/tags/v')
|
||||
needs: docs
|
||||
runs-on: ubuntu-latest
|
||||
environment:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
|
||||
steps:
|
||||
- name: Setup Pages
|
||||
uses: actions/configure-pages@v2
|
||||
- name: Download HTML docs
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: attack_flow_docs_html
|
||||
path: docs
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v1
|
||||
with:
|
||||
path: ./docs
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v1
|
||||
20
database/.github/workflows/docker-compose.yml
поставляемый
Обычный файл
@ -0,0 +1,20 @@
|
||||
name: Test Docker image
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'main'
|
||||
tags:
|
||||
- '*'
|
||||
|
||||
jobs:
|
||||
docker-compose:
|
||||
# run docker-compose file and clean up before action finished
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
- name: Launch Attack Flow using Docker Compose
|
||||
uses: isbang/compose-action@v1.4.1
|
||||
with:
|
||||
compose-file: "docker-compose.yml"
|
||||
34
database/.github/workflows/docker.yml
поставляемый
Обычный файл
@ -0,0 +1,34 @@
|
||||
name: Publish Docker image
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'main'
|
||||
tags:
|
||||
- '*'
|
||||
|
||||
jobs:
|
||||
docker:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
- name: Log in to the Container registry
|
||||
uses: docker/login-action@v1
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Get Docker metadata
|
||||
id: af_meta
|
||||
uses: docker/metadata-action@v4
|
||||
with:
|
||||
images: ghcr.io/${{ github.repository }}
|
||||
labels: org.opencontainers.image.url=https://ctid.mitre-engenuity.org/our-work/attack-flow/
|
||||
- name: Build Attack Flow Docker image
|
||||
uses: docker/build-push-action@v2
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
tags: ${{ steps.af_meta.outputs.tags }}
|
||||
labels: ${{ steps.af_meta.outputs.labels }}
|
||||
32
database/.github/workflows/test.yml
поставляемый
Обычный файл
@ -0,0 +1,32 @@
|
||||
name: Test
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
python_lib:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.8'
|
||||
- name: Install Poetry
|
||||
run: curl -sSL https://install.python-poetry.org/ | python -
|
||||
- name: Add Poetry to PATH
|
||||
run: echo "$HOME/.poetry/bin" >> $GITHUB_PATH
|
||||
- name: Install Python dependencies
|
||||
run: poetry install
|
||||
- name: Check code formatting
|
||||
run: poetry run black --check src/attack_flow/
|
||||
- name: Run unit tests
|
||||
run: poetry run make test-ci
|
||||
- name: Upload coverage to CodeCov
|
||||
uses: codecov/codecov-action@v4
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_SECRET }}
|
||||
files: coverage.xml
|
||||
verbose: true
|
||||
138
database/.gitignore
поставляемый
Обычный файл
@ -0,0 +1,138 @@
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
pip-wheel-metadata/
|
||||
share/python-wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
MANIFEST
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.nox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
*.py,cover
|
||||
.hypothesis/
|
||||
.pytest_cache/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Django stuff:
|
||||
*.log
|
||||
local_settings.py
|
||||
db.sqlite3
|
||||
db.sqlite3-journal
|
||||
|
||||
# Flask stuff:
|
||||
instance/
|
||||
.webassets-cache
|
||||
|
||||
# Scrapy stuff:
|
||||
.scrapy
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
docs/requirements.txt
|
||||
|
||||
# PyBuilder
|
||||
target/
|
||||
|
||||
# Jupyter Notebook
|
||||
.ipynb_checkpoints
|
||||
|
||||
# IPython
|
||||
profile_default/
|
||||
ipython_config.py
|
||||
|
||||
# pyenv
|
||||
.python-version
|
||||
|
||||
# pipenv
|
||||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
||||
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
||||
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
||||
# install all needed dependencies.
|
||||
#Pipfile.lock
|
||||
|
||||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
|
||||
__pypackages__/
|
||||
|
||||
# Celery stuff
|
||||
celerybeat-schedule
|
||||
celerybeat.pid
|
||||
|
||||
# SageMath parsed files
|
||||
*.sage.py
|
||||
|
||||
# Environments
|
||||
.env
|
||||
.venv
|
||||
env/
|
||||
venv/
|
||||
ENV/
|
||||
env.bak/
|
||||
venv.bak/
|
||||
|
||||
# Spyder project settings
|
||||
.spyderproject
|
||||
.spyproject
|
||||
|
||||
# Rope project settings
|
||||
.ropeproject
|
||||
|
||||
# mkdocs documentation
|
||||
/site
|
||||
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
.dmypy.json
|
||||
dmypy.json
|
||||
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
|
||||
# IDE settings
|
||||
.vscode/
|
||||
|
||||
# MacOS
|
||||
.DS_Store
|
||||
|
||||
TODO.*
|
||||
56
database/CONTRIBUTING.md
Обычный файл
@ -0,0 +1,56 @@
|
||||
# Contribute
|
||||
|
||||
## How to contribute
|
||||
|
||||
Thanks for contributing to Attack Flow!
|
||||
|
||||
You are welcome to comment on issues, open new issues, and open pull requests.
|
||||
|
||||
Pull requests should target the **main** branch of the repository, and should pass all tests.
|
||||
|
||||
Also, if you contribute any source code, we need you to agree to the following Developer's Certificate of
|
||||
Origin below.
|
||||
|
||||
## Reporting Issues
|
||||
|
||||
* Describe (in detail) what should have happened. Include any supporting information that may be helpful in
|
||||
resolving the issue.
|
||||
|
||||
* Be sure to include any steps to replicate the issue.
|
||||
|
||||
## Submission Guidelines
|
||||
|
||||
You are welcome to comment on issues, open new issues, and open pull requests.
|
||||
|
||||
Pull requests should target the **main** branch of the repository.
|
||||
|
||||
Also, if you contribute any source code, we need you to agree to the following Developer's Certificate of
|
||||
Origin below.
|
||||
|
||||
### Developer's Certificate of Origin v1.1
|
||||
|
||||
```
|
||||
By making a contribution to this project, I certify that:
|
||||
|
||||
(a) The contribution was created in whole or in part by me and I
|
||||
have the right to submit it under the open source license
|
||||
indicated in the file; or
|
||||
|
||||
(b) The contribution is based upon previous work that, to the best
|
||||
of my knowledge, is covered under an appropriate open source
|
||||
license and I have the right under that license to submit that
|
||||
work with modifications, whether created in whole or in part
|
||||
by me, under the same open source license (unless I am
|
||||
permitted to submit under a different license), as indicated
|
||||
in the file; or
|
||||
|
||||
(c) The contribution was provided directly to me by some other
|
||||
person who certified (a), (b) or (c) and I have not modified
|
||||
it.
|
||||
|
||||
(d) I understand and agree that this project and the contribution
|
||||
are public and that a record of the contribution (including all
|
||||
personal information I submit with it, including my sign-off) is
|
||||
maintained indefinitely and may be redistributed consistent with
|
||||
this project or the open source license(s) involved.
|
||||
```
|
||||
9
database/Dockerfile
Обычный файл
@ -0,0 +1,9 @@
|
||||
FROM node:16 AS builder
|
||||
|
||||
COPY src/attack_flow_builder /attack_flow_builder
|
||||
WORKDIR /attack_flow_builder
|
||||
RUN npm ci
|
||||
RUN npm run build
|
||||
|
||||
FROM nginx:1.21-alpine
|
||||
COPY --from=builder /attack_flow_builder/dist /usr/share/nginx/html
|
||||
201
database/LICENSE
Обычный файл
@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
61
database/Makefile
Обычный файл
@ -0,0 +1,61 @@
|
||||
ROOTDIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
|
||||
SOURCEDIR = docs/
|
||||
BUILDDIR = docs/_build/
|
||||
|
||||
.PHONY: help
|
||||
help:
|
||||
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' | sort
|
||||
|
||||
.PHONY: docs
|
||||
docs: ## Build Sphinx documentation
|
||||
sphinx-build -M dirhtml "$(SOURCEDIR)" "$(BUILDDIR)"
|
||||
|
||||
docs-server: ## Run the Sphinx dev server
|
||||
sphinx-autobuild -b dirhtml -a "$(SOURCEDIR)" "$(BUILDDIR)"
|
||||
|
||||
src/attack_flow_builder/dist/cli.common.js: src/attack_flow_builder/src/cli.ts
|
||||
cd src/attack_flow_builder && env VUE_CLI_SERVICE_CONFIG_PATH="${ROOTDIR}src/attack_flow_builder/vue.cli.config.js" npx vue-cli-service build --target lib --name cli --formats commonjs --no-clean src/cli.ts
|
||||
|
||||
docs-examples: src/attack_flow_builder/dist/cli.common.js ## Build example flows
|
||||
mkdir -p docs/extra/corpus
|
||||
cp corpus/*.afb docs/extra/corpus
|
||||
node src/attack_flow_builder/dist/cli.common.js --verbose corpus/*.afb
|
||||
cp corpus/*.json docs/extra/corpus
|
||||
ls -1 corpus/*.json | sed 's/corpus\/\(.*\)\.json/\1/' | xargs -t -I {} af graphviz "corpus/{}.json" "docs/extra/corpus/{}.dot"
|
||||
ls -1 docs/extra/corpus/*.dot | xargs -t -I {} dot -Tpng -O -q1 "{}"
|
||||
ls -1 corpus/*.json | sed 's/corpus\/\(.*\)\.json/\1/' | xargs -t -I {} af mermaid "corpus/{}.json" "docs/extra/corpus/{}.mmd"
|
||||
ls -1 corpus/*.json | sed 's/corpus\/\(.*\)\.json/\1/' | xargs -t -I {} mmdc -i "docs/extra/corpus/{}.mmd" -o "docs/extra/corpus/{}.mmd.png"
|
||||
af doc-examples corpus/ docs/example_flows.rst
|
||||
|
||||
docs-matrix: ## Build the Navigator visualization JS code
|
||||
mkdir -p docs/extra/matrix
|
||||
cp src/matrix-viz/* docs/extra/matrix/
|
||||
|
||||
docs-schema: ## Build the schema documentation
|
||||
af doc-schema stix/attack-flow-schema-2.0.0.json stix/attack-flow-example.json docs/language.rst
|
||||
|
||||
docs-pdf: ## Build Sphinx documentation in PDF format.
|
||||
poetry export --dev --without-hashes -f requirements.txt -o docs/requirements.txt
|
||||
docker run --rm -v "$(PWD)/docs":/docs sphinxdoc/sphinx-latexpdf:4.3.1 \
|
||||
bash -c "pip install -r requirements.txt && sphinx-build -M latexpdf /docs /docs/_build"
|
||||
rm docs/requirements.txt
|
||||
|
||||
test: ## Run Python tests
|
||||
pytest --cov=src/ --cov-report=term-missing
|
||||
|
||||
test-ci: ## Run Python tests with XML coverage.
|
||||
pytest --cov=src/ --cov-report=xml
|
||||
|
||||
validate: src/attack_flow_builder/dist/cli.common.js ## Validate all flows in the corpus.
|
||||
mkdir -p docs/extra/corpus
|
||||
cp corpus/*.afb docs/extra/corpus
|
||||
node src/attack_flow_builder/dist/cli.common.js --verbose corpus/*.afb
|
||||
af validate \
|
||||
stix/attack-flow-example.json \
|
||||
corpus/*.json
|
||||
|
||||
docker-build: ## Build the Docker image.
|
||||
docker build . -t attack-flow-builder:latest
|
||||
|
||||
docker-run: ## Run the Docker image.
|
||||
docker run --rm -p 8080:80 attack-flow-builder:latest
|
||||
84
database/README.md
Обычный файл
@ -0,0 +1,84 @@
|
||||
[](https://attack.mitre.org/versions/v15/)
|
||||
[](https://github.com/center-for-threat-informed-defense/attack-flow/actions/workflows/test.yml)
|
||||
[](https://github.com/center-for-threat-informed-defense/attack-flow/actions/workflows/build.yml)
|
||||
[](https://codecov.io/gh/center-for-threat-informed-defense/attack-flow)
|
||||
|
||||
<!--
|
||||
When updating README.md, take a look at overview.rst and consider if you should
|
||||
make the same updates there.
|
||||
-->
|
||||
|
||||
# Attack Flow
|
||||
|
||||
Attack Flow is a language for describing how cyber adversaries combine and sequence various offensive
|
||||
techniques to achieve their goals. The project helps defenders and leaders understand how adversaries operate
|
||||
and improve their own defensive posture. This project is created and maintained by the [MITRE Engenuity Center
|
||||
for Threat-Informed Defense](https://ctid.mitre-engenuity.org/) in futherance of our mission to advance the
|
||||
start of the art and and the state of the practice in threat-informed defense globally. The project is funded
|
||||
by our [research participants](https://ctid.mitre-engenuity.org/our-work/attack-flow/#RESEARCH-PARTICIPANTS).
|
||||
|
||||
**Table Of Contents:**
|
||||
|
||||
- [Getting Started](#getting-started)
|
||||
- [Getting Involved](#getting-involved)
|
||||
- [Questions and Feedback](#questions-and-feedback)
|
||||
- [How Do I Contribute?](#how-do-i-contribute)
|
||||
- [Notice](#notice)
|
||||
|
||||
## Getting Started
|
||||
|
||||
To get started, we suggest skimming the documentation to get familiar with the project. Next, you may want to try creating
|
||||
your own attack flows using the Attack Flow Builder, which is an easy-to-use GUI tool. When you are ready to dive deep,
|
||||
review the Example Flows and JSON Schema for the language.
|
||||
|
||||
| Resource | Description |
|
||||
| ------------------------------------------------------------------------------------------- | ------------------------------------------------------ |
|
||||
| [Documentation](https://center-for-threat-informed-defense.github.io/attack-flow/) | Complete documentation for the Attack Flow project. |
|
||||
| [Attack Flow Builder](https://center-for-threat-informed-defense.github.io/attack-flow/ui/) | An online GUI tool for building Attack Flows. |
|
||||
| [JSON Schema](/stix/attack-flow-schema-2.0.0.json) | The language specification expressed as a JSON Schema. |
|
||||
| [Example Flows](/corpus/) | A corpus of example Attack Flows. |
|
||||
|
||||
## Getting Involved
|
||||
|
||||
There are several ways that you can get involved with this project and help
|
||||
advance threat-informed defense:
|
||||
|
||||
- **Review the language specification, use the builder to create some flows, and tell us what you think.** We
|
||||
welcome your review and feedback on the data model and our methodology.
|
||||
- **Help us prioritize additional example flows to create.** Let us know what examples you would like to
|
||||
turned into an Attack Flow. Your input will help us prioritize how we expand our corpus.
|
||||
- **Share your use cases.** We are interested in developing additional tools and resources to help the
|
||||
community understand and make threat-informed decisions in their risk management programs. If you have ideas
|
||||
or suggestions, we consider them as we explore additional research projects.
|
||||
|
||||
## Questions and Feedback
|
||||
|
||||
Please submit issues for any technical questions/concerns or contact ctid@mitre-engenuity.org directly for
|
||||
more general inquiries.
|
||||
|
||||
Also see the guidance for contributors if are you interested in contributing or simply reporting issues.
|
||||
|
||||
## How Do I Contribute?
|
||||
|
||||
We welcome your feedback and contributions to help advance Attack Flow. Please see the guidance for
|
||||
contributors if are you interested in [contributing or simply reporting issues.](/CONTRIBUTING.md)
|
||||
|
||||
Please submit [issues](https://github.com/center-for-threat-informed-defense/attack-flow/issues) for any
|
||||
technical questions/concerns or contact ctid@mitre-engenuity.org directly for more general inquiries.
|
||||
|
||||
## Notice
|
||||
|
||||
Copyright 2021 MITRE Engenuity. Approved for public release. Document number CT0040
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software distributed under the License is
|
||||
distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See
|
||||
the License for the specific language governing permissions and limitations under the License.
|
||||
|
||||
This project makes use of MITRE ATT&CK®
|
||||
|
||||
[ATT&CK Terms of Use](https://attack.mitre.org/resources/terms-of-use/)
|
||||
1
database/corpus/.gitignore
поставляемый
Обычный файл
@ -0,0 +1 @@
|
||||
*.json
|
||||
1
database/corpus/Black Basta Ransomware.afb
Обычный файл
1
database/corpus/CISA AA22-138B VMWare Workspace (Alt).afb
Обычный файл
1
database/corpus/CISA AA22-138B VMWare Workspace (TA1).afb
Обычный файл
1
database/corpus/CISA AA22-138B VMWare Workspace (TA2).afb
Обычный файл
1
database/corpus/CISA Iranian APT.afb
Обычный файл
1
database/corpus/Cobalt Kitty Campaign.afb
Обычный файл
1
database/corpus/Conti CISA Alert.afb
Обычный файл
1
database/corpus/Conti PWC.afb
Обычный файл
1
database/corpus/Conti Ransomware.afb
Обычный файл
1
database/corpus/DFIR - BumbleBee Round 2.afb
Обычный файл
1
database/corpus/Equifax Breach.afb
Обычный файл
1
database/corpus/Example Attack Tree.afb
Обычный файл
1
database/corpus/FIN13 Case 1.afb
Обычный файл
1
database/corpus/FIN13 Case 2.afb
Обычный файл
1
database/corpus/Gootloader.afb
Обычный файл
1
database/corpus/Hancitor DLL.afb
Обычный файл
1
database/corpus/Ivanti Vulnerabilities.afb
Обычный файл
1
database/corpus/JP Morgan Breach.afb
Обычный файл
1
database/corpus/MITRE NERVE.afb
Обычный файл
1
database/corpus/Maastricht University Ransomware.afb
Обычный файл
1
database/corpus/Mac Malware Steals Crypto.afb
Обычный файл
1
database/corpus/Marriott Breach.afb
Обычный файл
1
database/corpus/Muddy Water.afb
Обычный файл
1
database/corpus/NotPetya.afb
Обычный файл
1
database/corpus/OceanLotus.afb
Обычный файл
1
database/corpus/REvil.afb
Обычный файл
1
database/corpus/Ragnar Locker.afb
Обычный файл
1
database/corpus/SWIFT Heist.afb
Обычный файл
1
database/corpus/SearchAwesome Adware.afb
Обычный файл
1
database/corpus/Shamoon.afb
Обычный файл
1
database/corpus/SolarWinds.afb
Обычный файл
1
database/corpus/Sony Malware.afb
Обычный файл
1
database/corpus/Target Breach.afb
Обычный файл
1
database/corpus/Tesla Kubernetes Breach.afb
Обычный файл
1
database/corpus/Turla - Carbon Emulation Plan.afb
Обычный файл
1
database/corpus/Turla - Snake Emulation Plan.afb
Обычный файл
1
database/corpus/Uber Breach.afb
Обычный файл
1
database/corpus/WhisperGate.afb
Обычный файл
1
database/data/.gitignore
поставляемый
Обычный файл
@ -0,0 +1 @@
|
||||
*.json
|
||||
12
database/docker-compose.yml
Обычный файл
@ -0,0 +1,12 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
attack-flow:
|
||||
image: ghcr.io/center-for-threat-informed-defense/attack-flow:latest
|
||||
## Uncomment this to use the local Dockerfile instead of the official image
|
||||
#build:
|
||||
# context: .
|
||||
# dockerfile: ./Dockerfile
|
||||
ports:
|
||||
- 8080:80
|
||||
restart: always
|
||||
Двоичные данные
database/docs/_static/CanaryToken.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 62 KiB |
Двоичные данные
database/docs/_static/Impact.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 169 KiB |
Двоичные данные
database/docs/_static/IngressTool.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 136 KiB |
Двоичные данные
database/docs/_static/MaliciousLink.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 70 KiB |
Двоичные данные
database/docs/_static/Nopreconditions.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 111 KiB |
Двоичные данные
database/docs/_static/PowerShell.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 130 KiB |
Двоичные данные
database/docs/_static/SpearPhishing.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 163 KiB |
Двоичные данные
database/docs/_static/VBAMacros.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 261 KiB |
1
database/docs/_static/action-condition.afb
поставляемый
Обычный файл
Двоичные данные
database/docs/_static/action-condition.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 66 KiB |
1
database/docs/_static/action.afb
поставляемый
Обычный файл
Двоичные данные
database/docs/_static/action.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 38 KiB |
1
database/docs/_static/asset.afb
поставляемый
Обычный файл
Двоичные данные
database/docs/_static/asset.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 60 KiB |
1
database/docs/_static/attack-paths.afb
поставляемый
Обычный файл
Двоичные данные
database/docs/_static/attack-paths.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 50 KiB |
Двоичные данные
database/docs/_static/builder-action-empty.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 3.2 KiB |
Двоичные данные
database/docs/_static/builder-action-filled.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 51 KiB |
Двоичные данные
database/docs/_static/builder-action-two.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 41 KiB |
Двоичные данные
database/docs/_static/builder-blank.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 186 KiB |
Двоичные данные
database/docs/_static/builder-context.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 30 KiB |
Двоичные данные
database/docs/_static/builder-menu.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 17 KiB |
Двоичные данные
database/docs/_static/builder-overview.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 289 KiB |
Двоичные данные
database/docs/_static/builder-validation.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 21 KiB |
1
database/docs/_static/condition-false.afb
поставляемый
Обычный файл
Двоичные данные
database/docs/_static/condition-false.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 99 KiB |
1
database/docs/_static/condition-true.afb
поставляемый
Обычный файл
Двоичные данные
database/docs/_static/condition-true.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 79 KiB |
277
database/docs/_static/css/ctid.css
поставляемый
Обычный файл
@ -0,0 +1,277 @@
|
||||
/* Document styles */
|
||||
|
||||
body {
|
||||
--text-color: #0B2338;
|
||||
--text-color-inverse: #FFFFFF;
|
||||
--text-background: #FFFFFF;
|
||||
--side-nav-background: #404040;
|
||||
|
||||
color: var(--text-color);
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
|
||||
/* MITRE Engenuity Core Colors */
|
||||
--me-core-yellow: #FFF601;
|
||||
--me-core-green: #7DEA49;
|
||||
--me-core-purple-light: #726DE2;
|
||||
--me-core-purple: #6241C5;
|
||||
--me-core-purple-dark: #2B1972;
|
||||
--me-core-blue-dark: #212C5E;
|
||||
--me-core-blue-darker: #0F1538;
|
||||
--me-core-gray-light: #F0F1F2;
|
||||
--me-core-gray: #B2B2B2;
|
||||
--me-hyperlink: #005B94;
|
||||
|
||||
/* MITRE Engenuity Extended Colors */
|
||||
--me-ext-navy: #212C5E;
|
||||
--me-ext-navy-dark: #0F1538;
|
||||
--me-ext-blue: #0096D1;
|
||||
--me-ext-blue-dark: #005B94;
|
||||
--me-ext-gray-green: #4DA185;
|
||||
--me-ext-gray-green-dark: #024F48;
|
||||
--me-ext-teal-highlighter: #29E6D0;
|
||||
--me-ext-teal-dark: #15B7AD;
|
||||
--me-ext-green-highlighter: #7DEA49;
|
||||
--me-ext-green-dark: #3CAB41;
|
||||
--me-ext-yellow-highlighter: #FFF601;
|
||||
--me-ext-yellow-dark: #FEDB22;
|
||||
--me-ext-orange-highlighter: #FF8A36;
|
||||
--me-ext-orange-dark: #F56600;
|
||||
--me-ext-cranberry-highlighter: #FF006B;
|
||||
--me-ext-cranberry-dark: #BD0044;
|
||||
}
|
||||
|
||||
@media screen and (min-width: 1100px) {
|
||||
.wy-nav-content-wrap {
|
||||
background-color: var(--me-core-gray-light);
|
||||
}
|
||||
|
||||
.wy-nav-content {
|
||||
background-color: var(--text-background);
|
||||
}
|
||||
}
|
||||
|
||||
em.newsgroup {
|
||||
background-color: var(--me-core-yellow);
|
||||
padding: 5px;
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
/* Anchor styles */
|
||||
|
||||
.rst-content a,
|
||||
.rst-content a:active,
|
||||
.rst-content a:visited {
|
||||
color: var(--me-hyperlink);
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* Don't underline font awesome icons in links. */
|
||||
.rst-content a .fa,
|
||||
.rst-content a:active .fa,
|
||||
.rst-content a:visited .fa {
|
||||
text-decoration: none;
|
||||
padding-right: 0.25em;
|
||||
}
|
||||
|
||||
/* Don't underline the permalink icon next to headers. */
|
||||
.rst-content a.headerlink,
|
||||
.rst-content a.headerlink:active,
|
||||
.rst-content a.headerlink:visited {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.rst-content a:hover {
|
||||
color: var(--me-text-color);
|
||||
}
|
||||
|
||||
.rst-content.style-external-links a.reference.external {
|
||||
padding-right: 1em;
|
||||
}
|
||||
|
||||
.rst-content.style-external-links a.reference.external:after {
|
||||
font-size: 80%;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
/* Bootstrap button styles */
|
||||
|
||||
.btn,
|
||||
.btn:focus,
|
||||
.btn-primary,
|
||||
.btn-primary:focus {
|
||||
background-color: var(--me-core-purple);
|
||||
}
|
||||
|
||||
.btn:hover,
|
||||
.btn-primary:hover {
|
||||
background-color: var(--me-core-purple-light);
|
||||
}
|
||||
|
||||
.btn-secondary,
|
||||
.btn-secondary:focus {
|
||||
background-color: var(--text-color);
|
||||
}
|
||||
|
||||
.btn-secondary:hover {
|
||||
background-color: #737373;
|
||||
}
|
||||
|
||||
.btn-link,
|
||||
.btn-link:focus {
|
||||
color: var(--me-core-purple);
|
||||
}
|
||||
|
||||
.btn-link:hover {
|
||||
color: var(--me-core-purple-dark) !important;
|
||||
}
|
||||
|
||||
.rst-content a.btn,
|
||||
.rst-content a.btn:active,
|
||||
.rst-content a.btn:visited {
|
||||
color: var(--text-color-inverse);
|
||||
font-weight: normal;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* Table styles */
|
||||
.rst-content div.wy-table-responsive table.docutils {
|
||||
width: 100%;
|
||||
table-layout: fixed;
|
||||
}
|
||||
|
||||
.rst-content div.wy-table-responsive table.docutils thead th,
|
||||
.rst-content div.wy-table-responsive table.docutils tbody td {
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
.rst-content div.wy-table-responsive table.docutils thead th p,
|
||||
.rst-content div.wy-table-responsive table.docutils tbody td p {
|
||||
margin: 0.5em 0;
|
||||
}
|
||||
|
||||
.rst-content div.wy-table-responsive table.docutils thead th code.docutils,
|
||||
.rst-content div.wy-table-responsive table.docutils tbody td code.docutils {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
/* Table of contents styles */
|
||||
.rst-content .toctree-wrapper a {
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.rst-content .toctree-wrapper ul li ul {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
/* Side bar styles */
|
||||
|
||||
.wy-side-nav-search div.version {
|
||||
color: var(--text-color-inverse);
|
||||
}
|
||||
|
||||
.wy-nav-top {
|
||||
background-color: var(--me-core-purple-dark);
|
||||
}
|
||||
|
||||
.wy-nav-side {
|
||||
background-color: var(--side-nav-background);
|
||||
}
|
||||
|
||||
.wy-side-nav-search a {
|
||||
font-size: 1.6em;
|
||||
}
|
||||
|
||||
.wy-side-nav-search a.icon img.logo {
|
||||
max-width: 10rem;
|
||||
}
|
||||
|
||||
.wy-side-nav-search {
|
||||
background-color: var(--me-core-purple);
|
||||
}
|
||||
|
||||
.wy-menu-vertical p.caption {
|
||||
color: var(--text-color-inverse);
|
||||
}
|
||||
|
||||
.wy-menu-vertical li.current {
|
||||
background-color: var(--me-core-gray-light);
|
||||
}
|
||||
|
||||
/* Admonition styles */
|
||||
|
||||
.admonition {
|
||||
background-color: var(--me-core-gray-light) !important;
|
||||
color: var(--text-color);
|
||||
}
|
||||
|
||||
.admonition .admonition-title {
|
||||
padding: 0.8em 1em !important;
|
||||
}
|
||||
|
||||
.admonition a,
|
||||
.admonition a.reference.external:after {
|
||||
color: var(--text-color) !important;
|
||||
}
|
||||
|
||||
.admonition.attention .admonition-title {
|
||||
background-color: var(--me-ext-yellow-dark);
|
||||
color: var(--text-color);
|
||||
}
|
||||
|
||||
.admonition.caution .admonition-title,
|
||||
.admonition.warning .admonition-title {
|
||||
background-color: var(--me-ext-orange-highlighter);
|
||||
color: var(--text-color);
|
||||
}
|
||||
|
||||
.admonition.danger .admonition-title,
|
||||
.admonition.error .admonition-title {
|
||||
background-color: var(--me-ext-cranberry-highlighter);
|
||||
color: var(--text-color-inverse);
|
||||
}
|
||||
|
||||
.admonition.important .admonition-title {
|
||||
background-color: var(--me-ext-gray-green);
|
||||
color: var(--text-color-inverse);
|
||||
}
|
||||
|
||||
.admonition.hint .admonition-title,
|
||||
.admonition.tip .admonition-title {
|
||||
background-color: var(--me-ext-blue);
|
||||
color: var(--text-color-inverse);
|
||||
}
|
||||
|
||||
.admonition.note .admonition-title,
|
||||
.admonition.seealso .admonition-title {
|
||||
background-color: var(--me-ext-teal-highlighter);
|
||||
color: var(--text-color);
|
||||
}
|
||||
|
||||
/* Figure styles */
|
||||
|
||||
.rst-content figcaption p span.caption-text {
|
||||
font-size: 10pt;
|
||||
font-style: initial;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
/* Epigraph styles */
|
||||
|
||||
blockquote.epigraph {
|
||||
background-color: var(--me-core-gray-light);
|
||||
margin: 2em 0;
|
||||
padding: 1em;
|
||||
border-top: 3px solid #c9c9c9;
|
||||
border-bottom: 3px solid #c9c9c9;
|
||||
}
|
||||
|
||||
blockquote.epigraph p {
|
||||
font-size: 16pt;
|
||||
}
|
||||
|
||||
blockquote.epigraph p.attribution {
|
||||
margin: 0;
|
||||
font-size: 12pt;
|
||||
font-style: italic;
|
||||
}
|
||||
Двоичные данные
database/docs/_static/ctid_logo_white.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 62 KiB |
Двоичные данные
database/docs/_static/favicon.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 1.0 KiB |
2
database/docs/_static/matrix-base.svg
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 109 KiB |
Двоичные данные
database/docs/_static/matrix-example.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 154 KiB |
2
database/docs/_static/matrix-example.svg
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 114 KiB |
Двоичные данные
database/docs/_static/navigator-export.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 146 KiB |
1
database/docs/_static/notpetya-excerpt.afb
поставляемый
Обычный файл
Двоичные данные
database/docs/_static/notpetya-excerpt.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 44 KiB |
Двоичные данные
database/docs/_static/npx-serve-2.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 675 KiB |
Двоичные данные
database/docs/_static/npx-serve-3.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 975 KiB |
Двоичные данные
database/docs/_static/npx-serve.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 646 KiB |
5541
database/docs/_static/operator-condition.afb
поставляемый
Обычный файл
Двоичные данные
database/docs/_static/operator-condition.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 75 KiB |
5347
database/docs/_static/operator.afb
поставляемый
Обычный файл
Двоичные данные
database/docs/_static/operator.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 63 KiB |
1
database/docs/_static/stix-sdo.afb
поставляемый
Обычный файл
Двоичные данные
database/docs/_static/stix-sdo.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 26 KiB |
Двоичные данные
database/docs/_static/tesla.dot.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 227 KiB |
Двоичные данные
database/docs/_static/tesla.mmd.png
поставляемый
Обычный файл
|
После Ширина: | Высота: | Размер: 130 KiB |