<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://vulnerability.circl.lu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Sun, 04 Oct 2026 16:48:05 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-52838</title>
      <link>https://vulnerability.circl.lu/vuln/fkie_cve-2026-52838</link>
      <description>&lt;p&gt;Easy!Appointments is a self hosted appointment scheduler. Versions prior to 1.6.0 allow administrators to define a custom &amp;#34;booking disabled&amp;#34; message through the booking settings page. That value is stored in the `disable_booking_message` setting via a rich-text editor and later passed directly to the public `booking_message` view without escaping or sanitization. An authenticated administrator can store HTML or JavaScript in this field, enable disabled-booking mode, and trigger stored XSS in every unauthenticated visitor who opens the public booking page. Version 1.6.0 fixes the issue.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Easy!Appointments is a self hosted appointment scheduler. Versions prior to 1.6.0 allow administrators to define a custom &amp;#34;booking disabled&amp;#34; message through the booking settings page. That value is stored in the `disable_booking_message` setting via a rich-text editor and later passed directly to the public `booking_message` view without escaping or sanitization. An authenticated administrator can store HTML or JavaScript in this field, enable disabled-booking mode, and trigger stored XSS in every unauthenticated visitor who opens the public booking page. Version 1.6.0 fixes the issue.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/fkie_cve-2026-52838</guid>
    </item>
    <item>
      <title>GHSA-996f-334j-67g7 — Easy!Appointments disable_booking_message rendered as raw HTML on public booking page — Stored XSS</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-996f-334j-67g7</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Packagist: alextselegidis/easyappointments&lt;/p&gt;
&lt;p&gt;## Summary
 
Easy!Appointments allows administrators to define a custom &amp;#34;booking disabled&amp;#34; message through the booking settings page. That value is stored in the `disable_booking_message` setting via a rich-text editor and later passed directly to the public `booking_message` view without escaping or sanitization:
 
```php
&amp;lt;p&amp;gt;&amp;lt;?= vars(&amp;#39;message_text&amp;#39;) ?&amp;gt;&amp;lt;/p&amp;gt;
```
 
An authenticated administrator can store HTML or JavaScript in this field, enable disabled-booking mode, and trigger stored XSS in every unauthenticated visitor who opens the public booking page.
 
---
 
## Root Cause — Step by Step Code Flow
 
### Step 1 — Rich text editor value stored without sanitization
The booking settings page collects the message value from the Trumbowyg rich-text editor and submits it as raw HTML:
 
```javascript
// assets/js/pages/booking_settings.js line 61-92
bookingSettings.push({
    name: &amp;#39;disable_booking_message&amp;#39;,
    value: $disableBookingMessage.trumbowyg(&amp;#39;html&amp;#39;),
});
```
 
### Step 2 — Settings controller saves value verbatim
The backend settings controller persists the submitted value without any HTML sanitization:
 
```php
// application/controllers/Booking_settings.php line 76-104
$this-&amp;gt;settings_model-&amp;gt;save($setting);
```
 
### Step 3 — Public booking controller forwards stored value to view
When booking is disabled, the public booking controller loads the stored message and passes it directly to the view:
 
```php
// application/controllers/Booking.php line 113-132
$disable_bo…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Packagist: alextselegidis/easyappointments&lt;/p&gt;
&lt;p&gt;## Summary
 
Easy!Appointments allows administrators to define a custom &amp;#34;booking disabled&amp;#34; message through the booking settings page. That value is stored in the `disable_booking_message` setting via a rich-text editor and later passed directly to the public `booking_message` view without escaping or sanitization:
 
```php
&amp;lt;p&amp;gt;&amp;lt;?= vars(&amp;#39;message_text&amp;#39;) ?&amp;gt;&amp;lt;/p&amp;gt;
```
 
An authenticated administrator can store HTML or JavaScript in this field, enable disabled-booking mode, and trigger stored XSS in every unauthenticated visitor who opens the public booking page.
 
---
 
## Root Cause — Step by Step Code Flow
 
### Step 1 — Rich text editor value stored without sanitization
The booking settings page collects the message value from the Trumbowyg rich-text editor and submits it as raw HTML:
 
```javascript
// assets/js/pages/booking_settings.js line 61-92
bookingSettings.push({
    name: &amp;#39;disable_booking_message&amp;#39;,
    value: $disableBookingMessage.trumbowyg(&amp;#39;html&amp;#39;),
});
```
 
### Step 2 — Settings controller saves value verbatim
The backend settings controller persists the submitted value without any HTML sanitization:
 
```php
// application/controllers/Booking_settings.php line 76-104
$this-&amp;gt;settings_model-&amp;gt;save($setting);
```
 
### Step 3 — Public booking controller forwards stored value to view
When booking is disabled, the public booking controller loads the stored message and passes it directly to the view:
 
```php
// application/controllers/Booking.php line 113-132
$disable_bo…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-996f-334j-67g7</guid>
    </item>
  </channel>
</rss>
