VYPR
Moderate severityNVD Advisory· Published Apr 27, 2021· Updated Aug 3, 2024

Cross-Site Scripting in Content Rendering

CVE-2021-21365

Description

Bootstrap Package is a theme for TYPO3. It has been discovered that rendering content in the website frontend is vulnerable to cross-site scripting. A valid backend user account is needed to exploit this vulnerability. Users of the extension, who have overwritten the affected templates with custom code must manually apply the security fix. Update to version 7.1.2, 8.0.8, 9.1.4, 10.0.10 or 11.0.3 of the Bootstrap Package that fix the problem described. Updated version are available from the TYPO3 extension manager, Packagist and at https://extensions.typo3.org/extension/download/bootstrap_package/.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
bk2k/bootstrap-packagePackagist
>= 7.1.0, < 7.1.27.1.2
bk2k/bootstrap-packagePackagist
>= 8.0.0, < 8.0.88.0.8
bk2k/bootstrap-packagePackagist
>= 9.0.0, < 9.0.49.0.4
bk2k/bootstrap-packagePackagist
>= 9.1.0, < 9.1.39.1.3
bk2k/bootstrap-packagePackagist
>= 10.0.0, < 10.0.1010.0.10
bk2k/bootstrap-packagePackagist
>= 11.0.0, < 11.0.311.0.3

Affected products

1

Patches

1
de3a568fc311

[SECURITY] Ensure content element subheader is HTML encoded

5 files changed · +13 13
  • Resources/Private/Partials/ContentElements/Carousel/Item/CallToAction.html+2 2 modified
    @@ -4,9 +4,9 @@
                 <f:if condition="{item.data.nav_title}">
                     <div>{item.data.nav_title}</div>
                 </f:if>
    -            <h{item.data.header_layout} class="carousel-item-header{f:if(condition: item.data.header_class, then: ' {item.data.header_class}')}{f:if(condition: item.data.header_position, then: ' text-{item.data.header_position}')}"><f:format.htmlentitiesDecode>{item.data.header}</f:format.htmlentitiesDecode></h{item.data.header_layout}>
    +            <h{item.data.header_layout} class="carousel-item-header{f:if(condition: item.data.header_class, then: ' {item.data.header_class}')}{f:if(condition: item.data.header_position, then: ' text-{item.data.header_position}')}"><f:format.htmlspecialchars doubleEncode="false">{item.data.header}</f:format.htmlspecialchars></h{item.data.header_layout}>
                 <f:if condition="{item.data.subheader}">
    -                <h{item.data.subheader_layout} class="carousel-item-subheader{f:if(condition: item.data.subheader_class, then: ' {item.data.subheader_class}')}{f:if(condition: item.data.header_position, then: ' text-{item.data.header_position}')}"><f:format.htmlentitiesDecode>{item.data.subheader}</f:format.htmlentitiesDecode></h{item.data.subheader_layout}>
    +                <h{item.data.subheader_layout} class="carousel-item-subheader{f:if(condition: item.data.subheader_class, then: ' {item.data.subheader_class}')}{f:if(condition: item.data.header_position, then: ' text-{item.data.header_position}')}"><f:format.htmlspecialchars doubleEncode="false">{item.data.subheader}</f:format.htmlspecialchars></h{item.data.subheader_layout}>
                 </f:if>
                 <f:if condition="{item.data.bodytext}">
                     <div class="carousel-item-bodytext">
    
  • Resources/Private/Partials/ContentElements/Carousel/Item/Header.html+2 2 modified
    @@ -3,9 +3,9 @@
         <div class="valign" {f:if(condition: item.data.text_color,then:'style="color: {item.data.text_color};"')}>
             <div class="vcontainer">
                 <div class="carousel-text-inner">
    -                <h{item.data.header_layout} class="carousel-header awesome{f:if(condition: item.data.header_class, then: ' {item.data.header_class}')}{f:if(condition: item.data.header_position, then: ' text-{item.data.header_position}')}"><f:format.htmlentitiesDecode>{item.data.header}</f:format.htmlentitiesDecode></h{item.data.header_layout}>
    +                <h{item.data.header_layout} class="carousel-header awesome{f:if(condition: item.data.header_class, then: ' {item.data.header_class}')}{f:if(condition: item.data.header_position, then: ' text-{item.data.header_position}')}"><f:format.htmlspecialchars doubleEncode="false">{item.data.header}</f:format.htmlspecialchars></h{item.data.header_layout}>
                     <f:if condition="{item.data.subheader}">
    -                    <h{item.data.subheader_layout} class="carousel-subheader awesome{f:if(condition: item.data.subheader_class, then: ' {item.data.subheader_class}')}{f:if(condition: item.data.header_position, then: ' text-{item.data.header_position}')}"><f:format.htmlentitiesDecode>{item.data.subheader}</f:format.htmlentitiesDecode></h{item.data.subheader_layout}>
    +                    <h{item.data.subheader_layout} class="carousel-subheader awesome{f:if(condition: item.data.subheader_class, then: ' {item.data.subheader_class}')}{f:if(condition: item.data.header_position, then: ' text-{item.data.header_position}')}"><f:format.htmlspecialchars doubleEncode="false">{item.data.subheader}</f:format.htmlspecialchars></h{item.data.subheader_layout}>
                     </f:if>
                 </div>
             </div>
    
  • Resources/Private/Partials/ContentElements/Carousel/Item/TextAndImage.html+2 2 modified
    @@ -2,9 +2,9 @@
     <f:link.typolink parameter="{item.data.link}" additionalAttributes="{draggable:'false'}">
         <div class="valign">
             <div class="carousel-text vcontainer" {f:if(condition: item.data.text_color,then: 'style="color: {item.data.text_color};"')}>
    -            <h{item.data.header_layout} class="carousel-header{f:if(condition: item.data.header_class, then: ' {item.data.header_class}')}{f:if(condition: item.data.header_position, then: ' text-{item.data.header_position}')}"><f:format.htmlentitiesDecode>{item.data.header}</f:format.htmlentitiesDecode></h{item.data.header_layout}>
    +        <h{item.data.header_layout} class="carousel-header{f:if(condition: item.data.header_class, then: ' {item.data.header_class}')}{f:if(condition: item.data.header_position, then: ' text-{item.data.header_position}')}"><f:format.htmlspecialchars doubleEncode="false">{item.data.header}</f:format.htmlspecialchars></h{item.data.header_layout}>
                 <f:if condition="{item.data.subheader}">
    -                <h{item.data.subheader_layout} class="carousel-subheader{f:if(condition: item.data.subheader_class, then: ' {item.data.subheader_class}')}{f:if(condition: item.data.header_position, then: ' text-{item.data.header_position}')}"><f:format.htmlentitiesDecode>{item.data.subheader}</f:format.htmlentitiesDecode></h{item.data.subheader_layout}>
    +                <h{item.data.subheader_layout} class="carousel-subheader{f:if(condition: item.data.subheader_class, then: ' {item.data.subheader_class}')}{f:if(condition: item.data.header_position, then: ' text-{item.data.header_position}')}"><f:format.htmlspecialchars doubleEncode="false">{item.data.subheader}</f:format.htmlspecialchars></h{item.data.subheader_layout}>
                 </f:if>
                 <f:format.html>{item.data.bodytext}</f:format.html>
             </div>
    
  • Resources/Private/Partials/ContentElements/Carousel/Item/Text.html+2 2 modified
    @@ -4,9 +4,9 @@
                 <f:if condition="{item.data.nav_title}">
                     <div>{item.data.nav_title}</div>
                 </f:if>
    -            <h{item.data.header_layout} class="carousel-item-header{f:if(condition: item.data.header_class, then: ' {item.data.header_class}')}{f:if(condition: item.data.header_position, then: ' text-{item.data.header_position}')}"><f:format.htmlentitiesDecode>{item.data.header}</f:format.htmlentitiesDecode></h{item.data.header_layout}>
    +            <h{item.data.header_layout} class="carousel-item-header{f:if(condition: item.data.header_class, then: ' {item.data.header_class}')}{f:if(condition: item.data.header_position, then: ' text-{item.data.header_position}')}"><f:format.htmlspecialchars doubleEncode="false">{item.data.header}</f:format.htmlspecialchars></h{item.data.header_layout}>
                 <f:if condition="{item.data.subheader}">
    -                <h{item.data.subheader_layout} class="carousel-item-subheader{f:if(condition: item.data.subheader_class, then: ' {item.data.subheader_class}')}{f:if(condition: item.data.header_position, then: ' text-{item.data.header_position}')}"><f:format.htmlentitiesDecode>{item.data.subheader}</f:format.htmlentitiesDecode></h{item.data.subheader_layout}>
    +                <h{item.data.subheader_layout} class="carousel-item-subheader{f:if(condition: item.data.subheader_class, then: ' {item.data.subheader_class}')}{f:if(condition: item.data.header_position, then: ' text-{item.data.header_position}')}"><f:format.htmlspecialchars doubleEncode="false">{item.data.subheader}</f:format.htmlspecialchars></h{item.data.subheader_layout}>
                 </f:if>
                 <f:if condition="{item.data.bodytext}">
                     <div class="carousel-item-bodytext">
    
  • Resources/Private/Partials/ContentElements/Header/SubHeader.html+5 5 modified
    @@ -3,27 +3,27 @@
         <f:switch expression="{layout}">
             <f:case value="1">
                 <h2 class="{class} {positionClass}">
    -                <span><f:format.htmlentitiesDecode>{subheader}</f:format.htmlentitiesDecode></span>
    +                <span><f:format.htmlspecialchars doubleEncode="false">{subheader}</f:format.htmlspecialchars></span>
                 </h2>
             </f:case>
             <f:case value="2">
                 <h3 class="{class} {positionClass}">
    -                <span><f:format.htmlentitiesDecode>{subheader}</f:format.htmlentitiesDecode></span>
    +                <span><f:format.htmlspecialchars doubleEncode="false">{subheader}</f:format.htmlspecialchars></span>
                 </h3>
             </f:case>
             <f:case value="3">
                 <h4 class="{class} {positionClass}">
    -                <span><f:format.htmlentitiesDecode>{subheader}</f:format.htmlentitiesDecode></span>
    +                <span><f:format.htmlspecialchars doubleEncode="false">{subheader}</f:format.htmlspecialchars></span>
                 </h4>
             </f:case>
             <f:case value="4">
                 <h5 class="{class} {positionClass}">
    -                <span><f:format.htmlentitiesDecode>{subheader}</f:format.htmlentitiesDecode></span>
    +                <span><f:format.htmlspecialchars doubleEncode="false">{subheader}</f:format.htmlspecialchars></span>
                 </h5>
             </f:case>
             <f:case value="5">
                 <h6 class="{class} {positionClass}">
    -                <span><f:format.htmlentitiesDecode>{subheader}</f:format.htmlentitiesDecode></span>
    +                <span><f:format.htmlspecialchars doubleEncode="false">{subheader}</f:format.htmlspecialchars></span>
                 </h6>
             </f:case>
             <f:defaultCase>
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

5

News mentions

0

No linked articles in our index yet.