Skip to content

Commit 942e6fd

Browse files
fix(security): Address Dependabot and code scanning vulnerabilities (#17)
* fix(security): address Dependabot and code scanning vulnerabilities - Update Django from 5.0.7 to 5.1.4 to fix critical SQL injection vulnerabilities - Update asteval from 0.9.31 to 1.0.5 to fix sandbox escape vulnerabilities - Fix 4 stack trace exposure issues in views.py by using generic error messages - Add proper logging for error tracking without exposing sensitive information Fixes 18 open Dependabot alerts and 4 code scanning alerts * fix: use first Docker tag from metadata for Trivy scanner * fix: resolve pytest version conflict between requirements files * style: apply black formatting to views.py
1 parent a14b7b6 commit 942e6fd

3 files changed

Lines changed: 66 additions & 20 deletions

File tree

.github/workflows/docker.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ jobs:
6161
uses: aquasecurity/trivy-action@master
6262
if: github.event_name != 'pull_request'
6363
with:
64-
image-ref: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:sha-${{ github.sha }}
64+
image-ref: ${{ fromJSON(steps.meta.outputs.json).tags[0] }}
6565
format: 'sarif'
6666
output: 'trivy-results.sarif'
6767

modbus_app/views.py

Lines changed: 62 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
Views voor de Modbus webapp.
33
"""
44

5+
import logging
56
from datetime import timedelta
67

78
from django.contrib.auth.decorators import login_required
@@ -12,18 +13,37 @@
1213
from rest_framework.permissions import IsAdminUser, IsAuthenticated
1314
from rest_framework.response import Response
1415

15-
from .models import (Alarm, AlarmHistory, AuditLog, CalculatedRegister,
16-
DashboardGroup, DashboardWidget, Device, DeviceTemplate,
17-
ModbusInterface, Register, TrendData, TrendDataAggregated)
18-
from .serializers import (AlarmHistorySerializer, AlarmSerializer,
19-
AuditLogSerializer, CalculatedRegisterSerializer,
20-
DashboardGroupSerializer, DashboardWidgetSerializer,
21-
DeviceListSerializer, DeviceSerializer,
22-
DeviceTemplateSerializer,
23-
ModbusInterfaceListSerializer,
24-
ModbusInterfaceSerializer, RegisterListSerializer,
25-
RegisterSerializer, TrendDataAggregatedSerializer,
26-
TrendDataSerializer)
16+
from .models import (
17+
Alarm,
18+
AlarmHistory,
19+
AuditLog,
20+
CalculatedRegister,
21+
DashboardGroup,
22+
DashboardWidget,
23+
Device,
24+
DeviceTemplate,
25+
ModbusInterface,
26+
Register,
27+
TrendData,
28+
TrendDataAggregated,
29+
)
30+
from .serializers import (
31+
AlarmHistorySerializer,
32+
AlarmSerializer,
33+
AuditLogSerializer,
34+
CalculatedRegisterSerializer,
35+
DashboardGroupSerializer,
36+
DashboardWidgetSerializer,
37+
DeviceListSerializer,
38+
DeviceSerializer,
39+
DeviceTemplateSerializer,
40+
ModbusInterfaceListSerializer,
41+
ModbusInterfaceSerializer,
42+
RegisterListSerializer,
43+
RegisterSerializer,
44+
TrendDataAggregatedSerializer,
45+
TrendDataSerializer,
46+
)
2747
from .services.register_service import RegisterService
2848

2949

@@ -177,8 +197,15 @@ def test_connection(self, request, pk=None):
177197
)
178198
except Exception as e:
179199
interface.update_status("error")
200+
logging.getLogger(__name__).error(
201+
f"Connection test failed for interface {interface.name}: {str(e)}",
202+
exc_info=True,
203+
)
180204
return Response(
181-
{"status": "error", "message": str(e)},
205+
{
206+
"status": "error",
207+
"message": "Verbinding testen mislukt. Controleer de interface instellingen.",
208+
},
182209
status=status.HTTP_400_BAD_REQUEST,
183210
)
184211
finally:
@@ -292,8 +319,14 @@ def apply_template(self, request, pk=None):
292319
status=status.HTTP_404_NOT_FOUND,
293320
)
294321
except Exception as e:
322+
logging.getLogger(__name__).error(
323+
f"Failed to create registers from template: {str(e)}", exc_info=True
324+
)
295325
return Response(
296-
{"status": "error", "message": str(e)},
326+
{
327+
"status": "error",
328+
"message": "Kon registers niet aanmaken van template. Controleer de template configuratie.",
329+
},
297330
status=status.HTTP_400_BAD_REQUEST,
298331
)
299332

@@ -369,8 +402,14 @@ def read_now(self, request, pk=None):
369402
}
370403
)
371404
except Exception as e:
405+
logging.getLogger(__name__).error(
406+
f"Failed to read register {register.name}: {str(e)}", exc_info=True
407+
)
372408
return Response(
373-
{"status": "error", "message": str(e)},
409+
{
410+
"status": "error",
411+
"message": "Kon register niet lezen. Controleer de verbinding en register configuratie.",
412+
},
374413
status=status.HTTP_400_BAD_REQUEST,
375414
)
376415

@@ -408,8 +447,15 @@ def write_value(self, request, pk=None):
408447
}
409448
)
410449
except Exception as e:
450+
logging.getLogger(__name__).error(
451+
f"Failed to write value to register {register.name}: {str(e)}",
452+
exc_info=True,
453+
)
411454
return Response(
412-
{"status": "error", "message": str(e)},
455+
{
456+
"status": "error",
457+
"message": "Kon waarde niet schrijven naar register. Controleer of het register schrijfbaar is en de waarde geldig is.",
458+
},
413459
status=status.HTTP_400_BAD_REQUEST,
414460
)
415461

requirements.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
amqp==5.3.1
22
anyio==4.12.0
33
asgiref==3.11.0
4-
asteval==0.9.31
4+
asteval==1.0.5
55
attrs==25.4.0
66
autobahn==25.12.1
77
Automat==25.4.16
@@ -52,8 +52,8 @@ Pygments==2.19.2
5252
pymodbus==3.5.0
5353
pyOpenSSL==25.3.0
5454
pyserial==3.5
55-
pytest==8.3.4
56-
pytest-cov==6.0.0
55+
pytest==9.0.2
56+
pytest-cov==7.0.0
5757
pytest-django==4.11.1
5858
python-crontab==3.3.0
5959
python-dateutil==2.9.0.post0

0 commit comments

Comments
 (0)