<feed xmlns='http://www.w3.org/2005/Atom'>
<title>packages/net/ddns-scripts/Makefile, branch master</title>
<subtitle>Mirror of packages feed</subtitle>
<id>https://git-03.infra.openwrt.org/feed/packages/atom?h=master</id>
<link rel='self' href='https://git-03.infra.openwrt.org/feed/packages/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git-03.infra.openwrt.org/feed/packages/'/>
<updated>2026-07-30T09:43:04Z</updated>
<entry>
<title>ddns-scripts: fix root command injection through ddns_dateformat</title>
<updated>2026-07-30T09:43:04Z</updated>
<author>
<name>Hauke Mehrtens</name>
</author>
<published>2026-07-26T16:08:10Z</published>
<link rel='alternate' type='text/html' href='https://git-03.infra.openwrt.org/feed/packages/commit/?id=7364629d70df51f2f618a867e901151b6764ee5d'/>
<id>urn:sha1:7364629d70df51f2f618a867e901151b6764ee5d</id>
<content type='text'>
The date format read from the UCI option ddns.global.ddns_dateformat was
embedded into a command string that is later executed through "eval", both
for the recurring log timestamps

  DATE_PROG="date +'$ddns_dateformat'"
  ...
  write_log 5 "PID '$$' started at $(eval $DATE_PROG)"

and for the "last update" timestamp in the updater

  EPOCH_TIME="date -d @$EPOCH_TIME +'$ddns_dateformat'"
  write_log 7 "last update: $(eval $EPOCH_TIME)"

The value is only wrapped in single quotes, so a single quote inside it
closes that quote and starts a new shell word. A user who can write the ddns
configuration - a delegated DDNS operator who was never granted shell access
- can set

  ddns_dateformat="%F'; touch /tmp/pwned; '"

and have arbitrary commands run as root, because the updater runs as root.
The injection triggers on the next start of the updater, so in practice on
the next reconfiguration or reboot.

Stop building shell code from the option. Provide date_prog() as an ordinary
shell function and pass the format as a single quoted argument in both
places, which leaves no way for its content to be interpreted by the shell.
The remaining use of ddns_dateformat in dynamic_dns_updater.sh, for
NEXT_CHECK_TIME, already substituted it as a quoted argument without eval
and was not affected.

luci-app-ddns consumes the same option and is fixed separately in the LuCI
repository.

Reported-by: Matthew Hickey (Hacker Fantastic, https://hacker.house)
Fixes: 1c20dcb71a69 ("ddns-scripts: update to 2.7.6-1")
Assisted-by: Claude:claude-opus-5
Signed-off-by: Hauke Mehrtens &lt;hauke@hauke-m.de&gt;
</content>
</entry>
<entry>
<title>ddns-scripts: update to 2.8.4</title>
<updated>2026-07-07T06:02:21Z</updated>
<author>
<name>Jiang Tengfei</name>
</author>
<published>2026-06-26T14:34:41Z</published>
<link rel='alternate' type='text/html' href='https://git-03.infra.openwrt.org/feed/packages/commit/?id=774c01bcba2634723aa6b3c3d169fd79112e51fc'/>
<id>urn:sha1:774c01bcba2634723aa6b3c3d169fd79112e51fc</id>
<content type='text'>
Bump PKG_VERSION for the ddns-scripts changes and reset PKG_RELEASE to
1 as requested.

Signed-off-by: Jiang Tengfei &lt;admin@shaoxia.xyz&gt;
</content>
</entry>
<entry>
<title>ddns-scripts: fix one.com prerm test syntax</title>
<updated>2026-07-07T06:02:21Z</updated>
<author>
<name>Jiang Tengfei</name>
</author>
<published>2026-06-26T14:34:25Z</published>
<link rel='alternate' type='text/html' href='https://git-03.infra.openwrt.org/feed/packages/commit/?id=3aca37405647d78ce38858a5c6491301d9b80e31'/>
<id>urn:sha1:3aca37405647d78ce38858a5c6491301d9b80e31</id>
<content type='text'>
Add the missing spaces around the test bracket in the one.com
pre-removal script and escape IPKG_INSTROOT consistently with the other
subpackages.

Signed-off-by: Jiang Tengfei &lt;admin@shaoxia.xyz&gt;
</content>
</entry>
<entry>
<title>ddns-scripts: add EuroDNS provider</title>
<updated>2026-07-06T08:59:48Z</updated>
<author>
<name>Angus Young</name>
</author>
<published>2026-07-02T01:05:56Z</published>
<link rel='alternate' type='text/html' href='https://git-03.infra.openwrt.org/feed/packages/commit/?id=ec5fcd69e8f63b422258d11046ffb73c8fa52e92'/>
<id>urn:sha1:ec5fcd69e8f63b422258d11046ffb73c8fa52e92</id>
<content type='text'>
Add EuroDNS provider for IPv4 and IPv6

Howto:

    set [USERNAME] to username
    set [PASSWORD] to password
    set [DOMAIN] to domain

https://help.eurodns.com/s/article/How-do-I-configure-DYNDNS?language=en_US
Signed-off-by: Angus Young &lt;me@angusyoung.nl&gt;
</content>
</entry>
<entry>
<title>ddns-scripts: add fallback for default values</title>
<updated>2026-06-09T09:19:35Z</updated>
<author>
<name>Andy Chiang</name>
</author>
<published>2026-06-07T03:06:48Z</published>
<link rel='alternate' type='text/html' href='https://git-03.infra.openwrt.org/feed/packages/commit/?id=de4f8fe9e35239e60c80fedcace6b5e6e0807ea9'/>
<id>urn:sha1:de4f8fe9e35239e60c80fedcace6b5e6e0807ea9</id>
<content type='text'>
In luci, the `interface` value has `o.default = 'wan'` configured.
Due to a behavior fix in 'o.default', values matching the default are
no longer saved. Currently, this is workedaround by disabling
'o.rmempty' in luci, but handling this compatibility fallback on the
backend is a cleaner and superior approach.

Ref: https://github.com/openwrt/luci/commit/b004197a277804ec0c8f092412b91c1d3e5936fa

Signed-off-by: Andy Chiang &lt;AndyChiang_git@outlook.com&gt;
</content>
</entry>
<entry>
<title>ddns-scripts: add blazingfast.io Anycast DNS provider</title>
<updated>2026-05-22T13:07:28Z</updated>
<author>
<name>Fotios Kitsantas</name>
</author>
<published>2026-05-19T18:39:50Z</published>
<link rel='alternate' type='text/html' href='https://git-03.infra.openwrt.org/feed/packages/commit/?id=288f220aa314038500587522a2509c01505d6a7e'/>
<id>urn:sha1:288f220aa314038500587522a2509c01505d6a7e</id>
<content type='text'>
Add DDNS update support for blazingfast.io Anycast DNS via their
REST API. Authentication is performed via JWT token obtained from
the login endpoint. Zone records are fetched to verify the record
type before update, ensuring IPv4 services only target A records
and IPv6 services only target AAAA records.

Service, zone and record IDs are passed via param_opt as
space-separated key=value pairs:
  service_id=X zone_id=Y record_id=Z

curl --config file approach is used throughout to avoid eval and
shell injection from user-controlled values. Supports both IPv4
and IPv6. For dual-stack, create two separate DDNS service sections
with their respective record IDs.

Tested on GL.iNet MT5000 (Brume 3) running OpenWrt with
ddns-scripts 2.8.2.

Signed-off-by: Fotios Kitsantas &lt;fkitsantas@icloud.com&gt;
</content>
</entry>
<entry>
<title>ddns-scripts: add blazingfast.io Anycast DNS provider</title>
<updated>2026-05-18T09:44:25Z</updated>
<author>
<name>Fotios Kitsantas</name>
</author>
<published>2026-05-10T13:22:55Z</published>
<link rel='alternate' type='text/html' href='https://git-03.infra.openwrt.org/feed/packages/commit/?id=3d12578d5881a8aae5207487add840fde8b2c3c2'/>
<id>urn:sha1:3d12578d5881a8aae5207487add840fde8b2c3c2</id>
<content type='text'>
Add DDNS update support for blazingfast.io Anycast DNS via their
REST API. Authentication is performed via JWT token obtained from
the login endpoint. Zone records are fetched to verify the record
type before update, ensuring IPv4 services only target A records
and IPv6 services only target AAAA records.

Service, zone and record IDs are passed via param_opt as
space-separated key=value pairs:
  service_id=X zone_id=Y record_id=Z

curl --config file approach is used throughout to avoid eval and
shell injection from user-controlled values. Supports both IPv4
and IPv6. For dual-stack, create two separate DDNS service sections
with their respective record IDs.

Tested on GL.iNet MT5000 (Brume 3) running OpenWrt with
ddns-scripts 2.8.2.

Signed-off-by: Fotios Kitsantas &lt;fkitsantas@icloud.com&gt;
</content>
</entry>
<entry>
<title>ddns-scripts: fix option name in updater messages</title>
<updated>2026-05-05T08:21:21Z</updated>
<author>
<name>Dharmik Parmar</name>
</author>
<published>2026-04-29T14:03:54Z</published>
<link rel='alternate' type='text/html' href='https://git-03.infra.openwrt.org/feed/packages/commit/?id=55f5134f694e8b17819150cffe374464ca3d6f00'/>
<id>urn:sha1:55f5134f694e8b17819150cffe374464ca3d6f00</id>
<content type='text'>
On master, updater help and missing-option text still refer to '-N'.
Use '-S' instead so the messages match accepted script options.
Also clarify that SECTION is the UCI section name/id to start.
This is a text-only change; runtime behavior is unchanged.

Bump PKG_RELEASE to 4.

Fixes: #27737
Signed-off-by: Dharmik Parmar &lt;dharmikparmar2004@yahoo.com&gt;
</content>
</entry>
<entry>
<title>ddns-scripts: netcup.com adjust update error path</title>
<updated>2026-04-27T12:26:29Z</updated>
<author>
<name>Tim Flubshi</name>
</author>
<published>2026-04-26T16:00:44Z</published>
<link rel='alternate' type='text/html' href='https://git-03.infra.openwrt.org/feed/packages/commit/?id=e6e05d2aa636dee3a069c9500a083b7d76fecdcc'/>
<id>urn:sha1:e6e05d2aa636dee3a069c9500a083b7d76fecdcc</id>
<content type='text'>
Adjust the update error handling path to avoid hard failures on
recoverable errors. This allows ddns to retry updates after the
configured retry interval and improves reliability.

Signed-off-by: Tim Flubshi &lt;flubshi@gmail.com&gt;
</content>
</entry>
<entry>
<title>ddns-scripts: add netcup.com support</title>
<updated>2026-03-25T06:31:57Z</updated>
<author>
<name>Tim Flubshi</name>
</author>
<published>2026-03-18T20:55:29Z</published>
<link rel='alternate' type='text/html' href='https://git-03.infra.openwrt.org/feed/packages/commit/?id=10b8f04e3efb33c19bdded3b8c691265d772acb1'/>
<id>urn:sha1:10b8f04e3efb33c19bdded3b8c691265d772acb1</id>
<content type='text'>
Add a new netcup DDNS provider using the netcup DNS api
(ccp.netcup.net) with API key authentication.

Configuration mapping:
* username  = netcup customer number
* password  = netcup API password
* param_enc = netcup API key (generated in the CCP)
* domain    = fully qualified subdomain to update  (e.g. home.example.de)
* param_opt = (optional) root/zone domain override (e.g. example.de)
              When omitted the root domain is derived by stripping the
              leftmost label from 'domain'. This only works correctly for
              a single subdomain level (e.g. "home.example.de").
              param_opt MUST be set explicitly in two cases:
              1. Deep subdomains: domain=test.internal.example.org
              2. ccSLD apex domains: domain=example.co.nz

Signed-off-by: Tim Flubshi &lt;flubshi@gmail.com&gt;
</content>
</entry>
</feed>
