Skip to content

Commit b6443da

Browse files
sri49jacobkagonTristanB17saipraveen18ATBull81
authored
CU-868j244hj :: 31.8.0 pre release (#6139)
* refactor edit SEP form to show selected option (#6096) * refactor build_fieldset_choices and build_input_hash * lint fix * enhance script to transition consumer role states to fully verified (#6103) * enhance script to transition consumer role states to fully verified * refactor to introduce batching * lint fix * refactor CSV handling in transition consumers script to append results and improve error logging * refactor * set new rop due date for bulk calls (#6102) * save * updates evidence spec * remove utils changes, add specs * update specs * remove binding * fix error * add specs for non esi bulk calls * remove local adjustments to run spec --------- Co-authored-by: Sai Praveen Gudimetla <saipraveen.gudimetla@gmail.com> * add devise to bundler audit ignore (#6098) * address gap in pvc logic (#6100) * save * updates evidence spec * separate rrv other bulk call updates --------- Co-authored-by: Sai Praveen Gudimetla <saipraveen.gudimetla@gmail.com> * remove custom handling on remove qhp applicant modal (#6108) Co-authored-by: Alec Turnbull <alecturnbull81@gmail.com> * refactor access verification logic in FamiliesController (#6115) * refactor access verification logic in FamiliesController * fix spec * remediate CVE-2026-33306 with bcrypt bump to 3.1.22 (#6120) CVE-2026-33306 bcrypt minor version uplift * data fix ridp verified consumers with bad bookmark url (#6121) * data fix for bad bookmark urls * update scope of fix to all ridp verified with bad bookmark * rubocop fix * set admin bookmark url to nil * security: fix bundler-audit vulnerabilities (activestorage) (#6133) fix: update gems to resolve bundler-audit security vulnerabilities This commit updates vulnerable gems identified by bundler-audit. See PR description for detailed analysis of changes and affected components. --------- Co-authored-by: Jacob Kagon <69021620+jacobkagon@users.noreply.github.com> Co-authored-by: Tristan <33517218+TristanB17@users.noreply.github.com> Co-authored-by: Sai Praveen Gudimetla <saipraveen.gudimetla@gmail.com> Co-authored-by: Alec Turnbull <alecturnbull81@gmail.com> Co-authored-by: Michael Karamanov <mdkaramanov@gmail.com> Co-authored-by: Marco (Polo) Ornelas <marco.ornelas@ideacrew.com>
1 parent 9381fae commit b6443da

24 files changed

Lines changed: 912 additions & 219 deletions

File tree

.bundler-audit.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,9 @@ ignore:
2929
- CVE-2024-43411 # GHSA-6v96-m24v-f58j – Low-risk XSS via domain takeover
3030
- CVE-2025-61921 # GHSA-mr3q-g2mv-mr4q - Sinatra ReDoS via ETag header
3131
- CVE-2026-25765 # GHSA-33mh-2634-fwr2 - faraday
32+
- GHSA-57hq-95w6-v4fc
33+
# CVE-2026-32700: patched version (5.0.3) requires Rails >= 7.0; project is on Rails 6.1.7.10.
34+
# Resolve by upgrading Rails to >= 7.0 and then devise to 5.0.3.
35+
# CVE-2026-33658: patched versions require Rails >= 7.2.3.1; project is on Rails 6.1.7.10.
36+
# Resolve by upgrading Rails to ~> 7.2.3.1, ~> 8.0.4.1, or >= 8.1.2.1.
37+
- CVE-2026-33658 # GHSA-p9fm-f462-ggrg – Active Storage DoS via multi-range requests in proxy mode

Gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ gem 'aws-sdk', '~> 3.2'
5959
gem 'aws-sdk-s3', '>= 1.208.0'
6060
# Ruby 3.1.6 ships with logger 1.5.0 but aws-sdk-core 3.240.0 requires logger 1.7.0; try removing logger dependency after next ruby upgrade
6161
gem 'logger', '~> 1.7.0'
62-
gem 'bcrypt', '~> 3.1'
62+
gem 'bcrypt', '~> 3.1.22'
6363
gem 'bootsnap', '>= 1.1', require: false
6464
gem 'browser', '2.7.0'
6565
gem 'ckeditor', '~> 5.1.3'

Gemfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1895,7 +1895,7 @@ GEM
18951895
thread_safe (~> 0.3, >= 0.3.1)
18961896
backports (3.23.0)
18971897
base64 (0.3.0)
1898-
bcrypt (3.1.13)
1898+
bcrypt (3.1.22)
18991899
benchmark-malloc (0.2.0)
19001900
benchmark-perf (0.6.0)
19011901
benchmark-trend (0.4.0)
@@ -2613,7 +2613,7 @@ DEPENDENCIES
26132613
aws-sdk (~> 3.2)
26142614
aws-sdk-s3 (>= 1.208.0)
26152615
axe-core-cucumber (~> 4.8.0)
2616-
bcrypt (~> 3.1)
2616+
bcrypt (~> 3.1.22)
26172617
benefit_markets!
26182618
benefit_sponsors!
26192619
bootsnap (>= 1.1)

SECURITY.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,24 @@
22

33
## Vulnerability Mitigations
44

5+
### GHSA-57hq-95w6-v4fc - Devise "change email" race condition
6+
7+
**Vulnerability:** A race condition in Devise's Confirmable module allows an attacker to confirm an email address they do not own. This affects any Devise application using the reconfirmable option (the default when using Confirmable with email changes). (`CVE-2026-32700`).
8+
9+
**Current Status:** Enroll is currently pinned to devise `4.5.x` through the `Gemfile`.
10+
11+
**Mitigation:** This CVE is temporarily added to `.bundler-audit.yml` as we are upgrading Rails 8 in parallel. The long-term fix is to upgrade `rails` to `>= 7.0` and devise to `5.0.3` simultaneously.
12+
13+
**Actions Taken:**
14+
1. Documented vulnerability and mitigation plan in this file.
15+
2. Added `GHSA-57hq-95w6-v4fc` to bundler-audit ignore list as a temporary exception.
16+
3. Tracked follow-up to remove the exception after Ruby upgrade.
17+
18+
**Ongoing Measures:**
19+
1. Keep this exception time boxed for 90 days as Rails 8 upgrade is coming soon.
20+
2. Remove the ignore entry after dependency upgrade.
21+
22+
523
### GHSA-wx95-c6cv-8532 - Nokogiri canonicalization failure error handling
624

725
**Vulnerability:** Nokogiri versions below `1.19.1` will not raise an exception when canonicalization fails, specifically when checking the return value of `xmlC14NExecute` in the associated canonicalization methods (`GHSA-wx95-c6cv-8532`).
@@ -244,6 +262,38 @@ We backported the upstream restriction that disallows the dangerous transformati
244262
1. When we upgrade Rails Version to ~> 7.1.5.2', '~> 7.2.2.2', '>= 8.0.2.1', we need to remove
245263
config/initializers/security_backports/active_storage_disallow_dangerous_transformations.rb
246264

265+
#### CVE-2026-33658
266+
267+
Source: https://github.com/rails/rails/security/advisories/GHSA-p9fm-f462-ggrg
268+
269+
**Description:**
270+
271+
```
272+
Rails Active Storage has a possible DoS vulnerability in proxy mode via multi-range requests. This affects ActiveStorage versions in Rails 6.1.7.10 and below.
273+
```
274+
275+
**Mitigation:**
276+
277+
Active Storage is NOT ENABLED in this application. The Active Storage engine is explicitly disabled in `config/application.rb` (line 12 is commented out). This CVE requires upgrading Rails from 6.1.x to 7.2.3.1+, 8.0.4.1+, or 8.1.2.1+ (major version upgrade).
278+
279+
**Risk Assessment:**
280+
- **Severity**: Not Applicable
281+
- **Actual Risk**: None - Active Storage is not loaded or used
282+
- **Impact**: No impact as the vulnerable component is not present
283+
284+
**Actions Taken:**
285+
286+
1. Verified Active Storage is disabled in config/application.rb
287+
2. Confirmed no config/storage.yml exists
288+
3. Confirmed no models use has_one_attached or has_many_attached
289+
4. Added CVE-2026-33658 to .bundler-audit.yml ignore list
290+
5. Documented reason for ignoring: requires major Rails version upgrade
291+
292+
**TODO - Future Actions**
293+
294+
1. When we upgrade Rails to ~> 7.2.3.1, ~> 8.0.4.1, or >= 8.1.2.1, remove CVE-2026-33658 from .bundler-audit.yml
295+
2. If Active Storage is ever enabled in the future, ensure patched Rails version is used
296+
247297
### CVE-2023-4771, CVE-2024-24815, CVE-2024-24816, CVE-2024-43407, CVE-2024-43411
248298

249299
**Sources:**
Lines changed: 26 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,30 @@
1-
document.addEventListener('click', function(e) {
2-
if (e.target.matches('button#delete_applicant_button_qhp')) {
3-
e.preventDefault();
4-
showModal();
5-
}
6-
7-
if (e.target.textContent.trim() === 'Cancel') {
8-
closeModal();
9-
}
10-
11-
if (e.target.matches('#destroy-confirm-qhp')) {
12-
confirmDestroyApplicantQhp(e, e.target.dataset.url);
13-
}
1+
$(document).on('click', 'button#delete_applicant_button_qhp', function (e) {
2+
e.preventDefault();
3+
$('#destroyApplicantQhp').modal();
4+
5+
$('#destroyApplicantQhp .modal-cancel-button').on('click', function (e) {
6+
$('#destroyApplicantQhp').modal('hidden');
7+
});
8+
$('.btn-confirmation').removeAttr('disabled');
149
});
1510

16-
function showModal() {
17-
const modal = document.getElementById('destroyApplicantQhp');
18-
modal.classList.add('show');
19-
modal.style.display = 'block';
20-
document.body.classList.add('modal-open');
21-
22-
const backdrop = document.createElement('div');
23-
backdrop.className = 'modal-backdrop fade show';
24-
document.body.appendChild(backdrop);
25-
26-
const confirmButton = document.querySelector('.btn-confirmation');
27-
if (confirmButton) confirmButton.removeAttribute('disabled');
28-
}
29-
30-
function closeModal() {
31-
const modal = document.getElementById('destroyApplicantQhp');
32-
if (modal) {
33-
modal.style.display = 'none';
34-
modal.classList.remove('show');
35-
}
36-
document.body.classList.remove('modal-open');
37-
const backdrop = document.querySelector('.modal-backdrop');
38-
if (backdrop) backdrop.remove();
39-
}
11+
$(document).on('click', '#destroy-confirm-qhp', function (e) {
12+
confirmDestroyApplicantQhp(e, $(this).data('url'));
13+
});
4014

4115
function confirmDestroyApplicantQhp(event, url) {
42-
const confirmButton = document.getElementById('destroy-confirm-qhp');
43-
confirmButton.disabled = true;
44-
event.preventDefault();
45-
event.stopImmediatePropagation();
46-
47-
// Clean up modal
48-
document.querySelectorAll('.modal-backdrop').forEach(el => el.classList.remove('modal-backdrop'));
49-
document.querySelectorAll('.modal-open').forEach(el => el.classList.remove('modal-open'));
50-
51-
// Get CSRF token from meta tag --> not needed when running cucumber test
52-
const csrfMeta = document.querySelector('meta[name="csrf-token"]');
53-
const csrfToken = csrfMeta ? csrfMeta.getAttribute('content') : '';
54-
55-
fetch(url, {
56-
method: 'DELETE',
57-
headers: { 'X-CSRF-Token': csrfToken }
58-
})
59-
.then(response => {
60-
closeModal();
61-
if (response.redirected) {
62-
// Follow the redirect from the controller
63-
window.location.href = response.url;
64-
} else if (response.ok) {
65-
// Fallback: navigate to applicants index
66-
const baseUrl = url.replace(/\/[^\/]+$/, '');
67-
window.location.href = baseUrl;
68-
} else {
69-
throw new Error(`HTTP ${response.status}`);
70-
}
71-
})
72-
.catch(error => {
73-
confirmButton.disabled = false;
74-
});
75-
}
16+
$('#destroy-confirm-qhp').prop('disabled', true);
17+
event.preventDefault();
18+
event.stopImmediatePropagation();
19+
20+
$('.modal-backdrop').removeClass('modal-backdrop');
21+
$('.modal-open').removeClass('modal-open');
22+
23+
$.ajax({
24+
url: url,
25+
type: 'DELETE',
26+
dataType: 'script',
27+
contentType: false,
28+
processData: false,
29+
});
30+
}

app/controllers/insured/families_controller.rb

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class Insured::FamiliesController < FamiliesController
1212
:check_insurance_reason, :verification, :verification_detail, :verification_individual, :verification_history, :personal, :inbox, :manage_family, :brokers, :enrollment_history]
1313
before_action :updateable?, only: [:delete_consumer_broker, :record_sep, :purchase, :upload_notice]
1414
before_action :init_qualifying_life_events, only: [:home, :manage_family, :find_sep]
15-
before_action :check_for_address_info, only: [:find_sep, :home]
15+
before_action :verify_access_prerequisites, only: [:find_sep, :home]
1616
before_action :check_employee_role
1717
before_action :find_or_build_consumer_role, only: [:home]
1818
before_action :calculate_dates, only: [:check_move_reason, :check_marriage_reason, :check_insurance_reason]
@@ -705,15 +705,11 @@ def init_qualifying_life_events
705705
end
706706
end
707707

708-
def check_for_address_info
708+
def verify_access_prerequisites
709709
if @person.has_active_employee_role?
710710
redirect_to edit_insured_employee_path(@person.active_employee_roles.first) if @person.addresses.blank?
711-
elsif @person.is_consumer_role_active?
712-
if !(@person.addresses.present? || (@person.is_homeless || @person.is_temporarily_out_of_state))
713-
redirect_to edit_insured_consumer_role_path(@person.consumer_role)
714-
elsif ridp_redirection
715-
redirect_to ridp_agreement_insured_consumer_role_index_path
716-
end
711+
elsif @person.is_consumer_role_active? && ridp_redirection
712+
redirect_to ridp_agreement_insured_consumer_role_index_path
717713
end
718714
end
719715

0 commit comments

Comments
 (0)