Security policy
Our security posture rests on scope rather than process: the apps are built so there is very little to secure in the first place. Everything below is verifiable rather than asserted, and where our apps differ we say so per app rather than making one claim that flatters the weaker case.
Common to every app
Hosting
Atlassian Forge. We operate no servers and hold no infrastructure.
Egress
None declared. Nothing is sent outside Atlassian, to us or to anyone else.
Telemetry
None. No analytics, no tracking, no cookies.
Our access
None. We cannot read app data, and hold no mechanism to retrieve it.
What each app can reach
Mermaid Diagrams & Gantt for Confluence
Requests no Atlassian permission scopes, which you can confirm on the install screen. It has no backend: a set of static resources served by Atlassian and executed in the reader's browser, sandboxed inside a Forge iframe. Diagram text is never transmitted and is stored by Confluence as part of the page it lives on. We keep no copy and run no database.
Recurring Requests & Templates for Jira Service Management
Requests five scopes:
read:servicedesk-request and
write:servicedesk-request to read the request being
copied and create the new one,
read:jira-work to read the answers of an attached form,
storage:app to hold schedules, templates and settings, and
report:personal-data to report the account ids it stores
each week, so that everything held for a closed account can be
erased. All five are shown on the install screen.
The two service desk scopes permit offline impersonation, which is what allows a scheduled request to be created as the customer who asked for it rather than as the app. The account it acts as always comes from platform context — the identity of the signed-in customer at the moment they created the schedule — and never from anything a browser can send. It cannot be pointed at another user.
This app does store data, in Forge storage scoped to your installation: the schedules and templates themselves, the details of the requests being repeated, and per-project settings. That includes personal data, which is set out in the privacy policy. It remains inside Atlassian and we cannot read it.
Issue Templates & Create Defaults for Jira
Requests six scopes, all shown on the install screen. Five of them
are Atlassian's recommended scope group for apps that work in
Jira's Create dialog, which has to be declared in full:
read:jira-work, write:jira-work,
manage:jira-configuration,
read:jira-user and manage:jira-project.
Within that group, the app uses read:jira-work to read
the form, the caller's own permissions, projects, issue types,
create screens, the issue a template is saved from and the key of
an issue just created from the template gallery, and to keep its
Create dialog settings in Jira;
write:jira-work to fill fields in the Create dialog
and to create the optional alert issue; and
manage:jira-configuration to put a note on each field
it fills, to read priorities and priority schemes, and to see the
licence status in the Create dialog. It makes no use of
read:jira-user or manage:jira-project.
The sixth scope, storage:app, holds templates, their
versions, usage counts and the daily check's results.
The only issues it ever creates itself are alert issues, which an administrator can switch on, and a test alert when an administrator asks for one. It never edits or deletes an issue. Filling the Create dialog happens in the person's browser, and the issue is still created by Jira, as that person.
This app records nothing about the people who use it: no account ids, names or email addresses, and not who saved, used, restored or deleted a template. Usage counts stay in your site's app storage and are not sent to us. Templates hold whatever administrators type or copy from an issue. What Save as template removes from a copied description, and everything else the app keeps, is set out in the privacy policy.
If something fails, it writes a short error line to its Forge logs, which Atlassian keeps and we can read. Those lines hold no account ids and nothing from the Create dialog form. The privacy policy says what they hold.
Application security
Diagram source is rendered with sanitisation permanently enabled. A diagram cannot inject scripts into a Confluence page, and this is not configurable.
Diagram nodes may carry links. These are parsed and bound by the app
rather than passed through to the renderer, and only
http and https URLs are permitted —
javascript:, data: and similar schemes are
rejected.
Third-party components are pinned and reviewed before upgrade. Mermaid Diagrams & Gantt uses Mermaid and CodeMirror, both MIT licensed. Recurring Requests uses only Atlassian's own Forge packages. Issue Templates uses Atlassian's Forge packages and React.
Where an app accepts input from a browser, it is treated as untrusted. In Recurring Requests this means the identity it acts as, the project it writes to and the request type it creates are all resolved from platform context on the server rather than taken from the request body, and administrative settings can only be changed from the project settings module.
In Issue Templates, the page a request came from, and on a project's pages the project itself, are taken from platform context rather than the request body, and every change to a template or a setting is checked against Jira's own permissions for the person making it. The work the app does as itself rather than as that person — keeping Jira's Create dialog settings in step, checking templates, and creating an alert issue — runs only after an administrator has been confirmed, or from the daily scheduled check. Template text shown on the Templates page is inserted as text, never as markup.
Reporting a vulnerability
Email security@eriksenlabs.com. Please include the app, what you observed, and enough detail to reproduce it.
- Acknowledged within 1 business day
- Assessed and triaged within 3 business days
- Fixes released as soon as they are ready, ahead of all other work
- You will be told when a fix ships, and credited if you wish
We will not pursue legal action against anyone who reports an issue in good faith, avoids privacy violations and service disruption, and gives us reasonable time to respond before disclosing publicly.
Incident response
If a security incident affects one of our apps, we follow the steps below. They are deliberately short: with no servers of ours, no outbound network access and no ability to read app data, the realistic incident is a defect in the app itself or in a dependency.
1. Detection. Reports reach us through security@eriksenlabs.com, the Atlassian Marketplace security bug bounty programme, or automated dependency alerts on our source repositories.
2. Triage. Acknowledged within 1 business day and assessed for severity and exploitability within 3. Security work takes priority over all other development.
3. Containment. Because our apps run on Atlassian Forge with no servers of ours, containment means shipping a corrected version or, if necessary, withdrawing the affected version from the Marketplace. There is no infrastructure of ours to isolate.
4. Notification. For any confirmed critical or high severity issue we notify Atlassian and affected customers using Atlassian's vulnerability notification templates, within the timeframes set by Atlassian's security bug fix policy. We do not wait for a fix to be ready before telling people.
5. Remediation and review. A fix is released, the reporter is told when it ships, and we record what happened and what changed so the same class of issue is prevented rather than patched.
What we do not claim
Eriksen Labs holds no SOC 2, ISO 27001 or comparable certification, and we have not completed a CAIQ questionnaire. We would rather say so plainly than imply otherwise.
For most reviews the relevant question is what an app can reach. Ours run on Atlassian's infrastructure, send nothing outside it, and ask only for the permissions each one needs, or that Atlassian requires as a group for a module it uses — listed above, per app. That is a more useful answer than a certificate covering infrastructure we do not operate.