labml icon indicating copy to clipboard operation
labml copied to clipboard

`Brakeman::SexpProcessor#process`: Type should be a Symbol

Open Jack12816 opened this issue 2 months ago • 1 comments

Hey there 👋 first things first: thank you for maintaining this great tool/gem! ❤️

Background

Brakeman version: 7.1.0 (works with 7.0.2) Rails version: 8.0.3 Ruby version: ruby 3.4.7 (2025-10-08 revision 7a5688e2a2) +PRISM [x86_64-linux]

Issue occurs with --prism AND --no-prism - seems unrelated.

Issue

/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:70
'Brakeman::SexpProcessor#process': Type should be a Symbol
Full stack trace
[Notice] Using configuration in /app/config/brakeman.yml
[Notice] Using Prism parser
Loading scanner...
Processing application in /app
Processing gems...
[Notice] Using Prism parser
Parsing Gemfile
[Notice] Detected Rails 8 application
(Processing gems) Duration: 0.007603007 seconds
Processing configuration...
[Notice] Using Prism parser
Parsing config/environment.rb
[Notice] Using Prism parser
Parsing config/application.rb
[Notice] Using Prism parser
Parsing config/environments/production.rb
[Notice] Escaping HTML by default
(Processing configuration) Duration: 0.002594072 seconds
Finding files...
(Finding files) Duration: 0.382053285 seconds
Parsing files...
[Notice] Using Prism parser
Parsing [...]
(Parsing files) Duration: 0.663424268 seconds
Detecting file types...
(Detecting file types) Duration: 0.007480011 seconds
Processing initializers...
(Processing initializers) Duration: 0.002072824 seconds
Processing libs...
(Processing libs) Duration: 0.014954371 seconds
Processing routes...
[Notice] Using Prism parser
Parsing config/routes.rb
(Processing routes) Duration: 0.002886525 seconds
Processing templates...
(Processing templates) Duration: 0.027191228 seconds
Processing data flow in templates...
[.. unrelated ..]
Rendering management/users/logins (["Management::UsersController#logins"])
Error when processing management/users/logins: Error when processing management/users/logins: Error when processing management/users/logins: Error when processing management/users/logins: Error when processing management/users/logins: Error when processing management/users/logins: Error when processing management/users/logins: Error when processing management/users/logins: undefined method 'empty?' for nil
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/base_processor.rb:94:in 'block in Brakeman::BaseProcessor#process_dstr'
(eval at /usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp.rb:628):3:in 'Array#map!'
(eval at /usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp.rb:628):3:in 'Sexp#map!'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/base_processor.rb:89:in 'Brakeman::BaseProcessor#process_dstr'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:76:in 'block in Brakeman::SexpProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:113:in 'Brakeman::SexpProcessor#in_context'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:72:in 'Brakeman::SexpProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/template_processor.rb:25:in 'Brakeman::TemplateProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/base_processor.rb:111:in 'block in Brakeman::BaseProcessor#process_block'
(eval at /usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp.rb:628):3:in 'Array#map!'
(eval at /usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp.rb:628):3:in 'Sexp#map!'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/base_processor.rb:110:in 'Brakeman::BaseProcessor#process_block'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:76:in 'block in Brakeman::SexpProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:113:in 'Brakeman::SexpProcessor#in_context'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:72:in 'Brakeman::SexpProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/template_processor.rb:25:in 'Brakeman::TemplateProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/base_processor.rb:59:in 'Brakeman::BaseProcessor#process_if'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:76:in 'block in Brakeman::SexpProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:113:in 'Brakeman::SexpProcessor#in_context'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:72:in 'Brakeman::SexpProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/template_processor.rb:25:in 'Brakeman::TemplateProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/base_processor.rb:111:in 'block in Brakeman::BaseProcessor#process_block'
(eval at /usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp.rb:628):3:in 'Array#map!'
(eval at /usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp.rb:628):3:in 'Sexp#map!'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/base_processor.rb:110:in 'Brakeman::BaseProcessor#process_block'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:76:in 'block in Brakeman::SexpProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:113:in 'Brakeman::SexpProcessor#in_context'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:72:in 'Brakeman::SexpProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/template_processor.rb:25:in 'Brakeman::TemplateProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/base_processor.rb:74:in 'Brakeman::BaseProcessor#process_iter'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:76:in 'block in Brakeman::SexpProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:113:in 'Brakeman::SexpProcessor#in_context'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:72:in 'Brakeman::SexpProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/template_processor.rb:25:in 'Brakeman::TemplateProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/base_processor.rb:111:in 'block in Brakeman::BaseProcessor#process_block'
(eval at /usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp.rb:628):3:in 'Array#map!'
(eval at /usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp.rb:628):3:in 'Sexp#map!'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/base_processor.rb:110:in 'Brakeman::BaseProcessor#process_block'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:76:in 'block in Brakeman::SexpProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:113:in 'Brakeman::SexpProcessor#in_context'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:72:in 'Brakeman::SexpProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/template_processor.rb:25:in 'Brakeman::TemplateProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/base_processor.rb:60:in 'Brakeman::BaseProcessor#process_if'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:76:in 'block in Brakeman::SexpProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:113:in 'Brakeman::SexpProcessor#in_context'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:72:in 'Brakeman::SexpProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/template_processor.rb:25:in 'Brakeman::TemplateProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/base_processor.rb:111:in 'block in Brakeman::BaseProcessor#process_block'
(eval at /usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp.rb:628):3:in 'Array#map!'
(eval at /usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp.rb:628):3:in 'Sexp#map!'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/base_processor.rb:110:in 'Brakeman::BaseProcessor#process_block'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:76:in 'block in Brakeman::SexpProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:113:in 'Brakeman::SexpProcessor#in_context'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:72:in 'Brakeman::SexpProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/template_processor.rb:25:in 'Brakeman::TemplateProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processor.rb:67:in 'Brakeman::Processor#process_template'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/lib/render_helper.rb:190:in 'Brakeman::RenderHelper#process_template'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/controller_alias_processor.rb:194:in 'Brakeman::ControllerAliasProcessor#process_template'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/controller_alias_processor.rb:176:in 'Brakeman::ControllerAliasProcessor#process_default_render'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/controller_alias_processor.rb:103:in 'block in Brakeman::ControllerAliasProcessor#process_defn'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/alias_processor.rb:531:in 'block in Brakeman::AliasProcessor#meth_env'
/usr/local/bundle/gems/brakeman-7.1.0/bundle/ruby/3.2.0/gems/sexp_processor-4.17.3/lib/sexp_processor.rb:452:in 'SexpProcessor::Environment#scope'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/alias_processor.rb:528:in 'Brakeman::AliasProcessor#meth_env'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/controller_alias_processor.rb:93:in 'Brakeman::ControllerAliasProcessor#process_defn'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:76:in 'block in Brakeman::SexpProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:113:in 'Brakeman::SexpProcessor#in_context'
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:72:in 'Brakeman::SexpProcessor#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/alias_processor.rb:63:in 'block in Brakeman::AliasProcessor#process_default'
(eval at /usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp.rb:628):3:in 'Array#map!'
(eval at /usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp.rb:628):3:in 'Sexp#map!'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/alias_processor.rb:61:in 'Brakeman::AliasProcessor#process_default'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/controller_alias_processor.rb:31:in 'Brakeman::ControllerAliasProcessor#process_controller'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processor.rb:50:in 'Brakeman::Processor#process_controller_alias'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/scanner.rb:365:in 'block (3 levels) in Brakeman::Scanner#process_controller_data_flows'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/scanner.rb:364:in 'Hash#each'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/scanner.rb:364:in 'block (2 levels) in Brakeman::Scanner#process_controller_data_flows'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/scanner.rb:71:in 'Brakeman::Scanner#process_step_file'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/scanner.rb:363:in 'block in Brakeman::Scanner#process_controller_data_flows'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/scanner.rb:432:in 'block in Brakeman::Scanner#track_progress'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/scanner.rb:429:in 'Array#each'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/scanner.rb:429:in 'Brakeman::Scanner#track_progress'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/scanner.rb:362:in 'Brakeman::Scanner#process_controller_data_flows'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/scanner.rb:139:in 'block in Brakeman::Scanner#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/scanner.rb:52:in 'Brakeman::Scanner#process_step'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/scanner.rb:138:in 'Brakeman::Scanner#process'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman.rb:414:in 'Brakeman.scan'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman.rb:100:in 'Brakeman.run'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/commandline.rb:162:in 'Brakeman::Commandline.run_brakeman'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/commandline.rb:125:in 'Brakeman::Commandline.regular_report'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/commandline.rb:171:in 'Brakeman::Commandline.run_report'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/commandline.rb:35:in 'Brakeman::Commandline.run'
/usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/commandline.rb:20:in 'Brakeman::Commandline.start'
/usr/local/bundle/gems/brakeman-7.1.0/bin/brakeman:10:in '<top (required)>'
/usr/local/bundle/bin/brakeman:25:in 'Kernel#load'
/usr/local/bundle/bin/brakeman:25:in '<main>'
[.. unrelated ..]
Indexing call sites...
/usr/local/bundle/gems/brakeman-7.1.0/lib/ruby_parser/bm_sexp_processor.rb:70:in 'Brakeman::SexpProcessor#process': Type should be a Symbol, not: [#<Brakeman::FilePath:0x00007ff8325786b8 @absolute="/app/app/views/management/users/logins.html.haml", @relative="app/views/management/users/logins.html.haml", @hash=1533502646516148342>, nil] in {#<Brakeman::FilePath:0x00007ff8325786b8 @absolute="/app/app/views/management/users/logins.html.haml", @relative="app/views/management/users/logins.html.haml", @hash=1533502646516148342> => nil} (RuntimeError)
	from /usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/processors/lib/find_all_calls.rb:24:in 'Brakeman::FindAllCalls#process_source'
	from /usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/tracker.rb:276:in 'block in Brakeman::Tracker#index_call_sites'
	from /usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/tracker.rb:130:in 'block in Brakeman::Tracker#each_template'
	from /usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/tracker.rb:129:in 'Array#each'
	from /usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/tracker.rb:129:in 'Brakeman::Tracker#each_template'
	from /usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/tracker.rb:275:in 'Brakeman::Tracker#index_call_sites'
	from /usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/scanner.rb:442:in 'Brakeman::Scanner#index_call_sites'
	from /usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/scanner.rb:143:in 'block in Brakeman::Scanner#process'
	from /usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/scanner.rb:52:in 'Brakeman::Scanner#process_step'
	from /usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/scanner.rb:142:in 'Brakeman::Scanner#process'
	from /usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman.rb:414:in 'Brakeman.scan'
	from /usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman.rb:100:in 'Brakeman.run'
	from /usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/commandline.rb:162:in 'Brakeman::Commandline.run_brakeman'
	from /usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/commandline.rb:125:in 'Brakeman::Commandline.regular_report'
	from /usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/commandline.rb:171:in 'Brakeman::Commandline.run_report'
	from /usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/commandline.rb:35:in 'Brakeman::Commandline.run'
	from /usr/local/bundle/gems/brakeman-7.1.0/lib/brakeman/commandline.rb:20:in 'Brakeman::Commandline.start'
	from /usr/local/bundle/gems/brakeman-7.1.0/bin/brakeman:10:in '<top (required)>'
	from /usr/local/bundle/bin/brakeman:25:in 'Kernel#load'
	from /usr/local/bundle/bin/brakeman:25:in '<main>'

`app/views/management/users/logins.html.haml`
- if @logins.empty?
  .dashboard.card.w-100.text-center
    .card-body= t('.no-logins-available')
- else
  .row
    .col-lg-9
      - @logins.each do |login|
        .row
          .col-12
            .dashboard.card{id: login.id}
              .card-header.d-flex.flex-row.align-items-center.justify-content-between
                %h5.card-header-title
                  %a.no-link.id-link{href: "#logins:#{login.id}", 'data-turbolinks' => 'false'}
                    - if login.successful?
                      - if login.unexpired? && login.unblacklisted?
                        %i.nav-icon.fas.fa-circle.color-success
                      - else
                        %i.nav-icon.far.fa-circle.color-warning

                      - if login.expired?
                        %span.tooltiped{title: l(login.expires_at)}
                          = t('.expired', when: since(login.expires_at))
                      - else
                        - if login.blacklisted?
                          %span
                            = t('.blacklisted')
                        - else
                          %span.tooltiped{title: l(login.expires_at)}
                            = t('.unexpired', when: since(login.expires_at))
                    - else
                      %i.nav-icon.fas.fa-circle.color-danger
                      %span.tooltiped{title: l(login.created_at)}
                        = t('.failed', when: since(login.created_at))

                - if login.successful? && login.unblacklisted?
                  %form.d-inline{action: blacklist_login_management_user_path(@user,
                    token: login.token, login_id: login.id), method: :post}
                    = hidden_field_tag :authenticity_token, form_authenticity_token
                    %button.btn.btn-link.p-0
                      %i.fas.fa-times
                      = t('.logout')

              .card-body
                %span
                  - if login.ip.postal_code.present?
                    = raw t('.login-ip-detailed', country: login.ip.country_name,
                      postal_code: login.ip.postal_code, city: login.ip.city_name,
                      ip: login.ip.address)
                  - else
                    = t('.login-ip', ip: login.ip.address)

                - if login.user_agent.raw.present?
                  %span.tooltiped{title: login.user_agent.raw, 'data-placement' => :bottom}
                    = raw t('.user-agent', browser: login.user_agent.browser || t('.unknown-browser'),
                      version: login.user_agent.version || t('.unknown-version'),
                      os: login.user_agent.os || t('.unknown-os'))
                    - if login.user_agent.bot?
                      = raw t('.user-agent-bot')
                    - if login.user_agent.mobile?
                      = raw t('.user-agent-mobile')
                    - else
                      = raw t('.user-agent-desktop')
                - else
                  = t('.no-user-agent')

    .col-lg-3
      .dashboard.card{id: :interactions}
        .card-header
          %h5.card-header-title
            %a.no-link.id-link{href: "#logins:interactions", 'data-turbolinks' => 'false'}
              = t('.actions')
        .card-body
          %ul.list-unstyled.mb-0
            %li.pt-2
              %form{action: blacklist_all_logins_management_user_path(@user), method: :post}
                = hidden_field_tag :authenticity_token, form_authenticity_token
                %button.btn.btn-danger.w-100
                  %i.nav-icon.fas.fa-lock
                  = t('.logout-all-devices')

The template works just fine in the application. ✌️ Is there anything I can provide to solve this? @presidentbeef

Jack12816 avatar Oct 23 '25 11:10 Jack12816

I can reproduce, thanks! Taking a look.

presidentbeef avatar Oct 31 '25 19:10 presidentbeef